这是我的情况。
这是我的做法:
using (StreamReader srReader = new StreamReader(strInputFile))
{
// loop until EOF
while ((strCurrentLine = srReader.ReadLine()) != null)
{
// "process" strCurrentLine...
// write the "processed" strCurrentLine to a new text file
using (StreamWriter sw = new StreamWriter(strFullOutputPathFileName, false))
{
// write strCurrentLine to the new file
sw.WriteLine("stuff...");
}
}
}
我的经理告诉我,使用
using
语句(就像我在循环中一样)会极大地影响性能。原因是因为 StreamWriter
实例将在我循环时创建多次。因此,如果我循环 1,000 次,我的 StreamWriter
对象就会有 1,000 个实例,这可能会严重影响性能。
这是真的吗?另外,我上面的方法是实现这一目标的最佳方法吗?
我的经理告诉我,像在循环中一样使用 using 语句会极大地影响性能。原因是因为 StreamWriter 实例将被创建与我循环一样多的次数。因此,如果我循环 1,000 次,我的 StreamWriter 对象就会有 1,000 个实例,这可能会严重影响性能。
这是真的吗?
嗯,这是真的,但不是因为您正在创建实例,而是因为您打开和关闭文件 1,000 次。 您可以创建 1,000 个字符串,而对性能几乎没有影响。
另外,我上面的方法是实现此目的的最佳方法吗?
首先,将 writer 创建移到
while
循环之外:
using (StreamReader srReader = new StreamReader(strInputFile))
{
// write the "processed" strCurrentLine to a new text file
using (StreamWriter sw = new StreamWriter(strFullOutputPathFileName, false))
{
// loop until EOF
while ((strCurrentLine = srReader.ReadLine()) != null)
{
// "process" strCurrentLine...
// write strCurrentLine to the new file
sw.WriteLine("stuff...");
}
}
}
但是,您也可以将整个文件读入内存,对其进行处理,然后在一次操作中将其写出。 影响将取决于已完成的处理以及出现错误时您是否想要部分结果。
将代码更改为:
using (StreamReader srReader = new StreamReader(strInputFile))
{
using (StreamWriter sw = new StreamWriter(strFullOutputPathFileName, false))
{
while ((strCurrentLine = srReader.ReadLine()) != null)
{
sw.WriteLine("stuff...");
}
}
}
另外,请查看乔恩关于附加的评论。
如果您的文件不大,您可以使用 File.ReadAllLines 获取字符串数组中的文件行,然后进行处理。
是的,您将通过这种方式创建许多 StreamWriter(但是,同时运行的实例并不多)。解决这个问题的一个简单方法是在进入 while 循环之前创建 StreamWriter。
您应该尽可能少地打开和关闭文件。 因此,在 while 循环之前打开它(创建 Streamwriter)。 在循环中使用 sw.WriteLine("stuff...") 循环后调用 sw.Close()。
你的经理是错误的,因为它不会创建 1000 个实例,因为每个实例都会在迭代结束时释放,但你将打开和关闭文件,这会影响性能。