这是我的情况。
以下是我的工作方式:
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
实例的创建次数与我循环次数相同。所以,如果我循环了1000次,我的StreamWriter
对象有1000个实例,这可能严重阻碍性能。
这是真的吗?另外,我的方法是否是实现此目标的最佳方法?
答案 0 :(得分:6)
我的经理告诉我,使用using语句就像我在循环中一样会极大地阻碍性能。原因是因为我将循环创建StreamWriter实例多次。因此,如果我循环1,000次,我的StreamWriter对象有1000个实例,这可能会严重影响性能。
这是真的吗?
嗯,这是真的,但不是因为您正在创建实例,而是因为您打开和关闭文件1,000次。您可以创建1,000个字符串,几乎不会影响性能。
另外,我的方法是否是实现此目标的最佳方法?
首先,将作者创建移到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...");
}
}
}
但是,您也可以将整个文件读入内存,进行处理,然后在一次操作中将其写出。影响将取决于已完成的处理以及是否需要部分结果,如果出现错误。
答案 1 :(得分:4)
将您的代码更改为:
using (StreamReader srReader = new StreamReader(strInputFile))
{
using (StreamWriter sw = new StreamWriter(strFullOutputPathFileName, false))
{
while ((strCurrentLine = srReader.ReadLine()) != null)
{
sw.WriteLine("stuff...");
}
}
}
另外,请查看Jon关于追加的评论。
答案 2 :(得分:2)
如果您的文件不大,您可以使用File.ReadAllLines获取字符串数组中的文件行,然后进行处理。
答案 3 :(得分:1)
是的,您将通过这种方式创建许多StreamWriters(但不是很多实例同时运行)。解决此问题的一种简单方法是在进入while循环之前创建StreamWriter。
答案 4 :(得分:0)
您应该尽可能少地打开和关闭文件。 所以在while循环之前打开它(创建streamwriter)。 在循环中使用sw.WriteLine(“stuff ...”) 循环后调用sw.Close()。
你的经理错误地认为它不会创建1000个实例,因为每个实例都会在迭代结束时被释放,但你将打开和关闭会影响性能的文件。
此致 戴姆詹·