Alb*_*eón 7 .net c# performance streamwriter
我必须将数千条动态生成的行写入文本文件.我有两个选择,哪个消耗更少的资源,比另一个更快?
A.使用StringBuilder和File.WriteAllText
StringBuilder sb = new StringBuilder();
foreach(Data dataItem in Datas)
{
sb.AppendLine(
String.Format(
"{0}, {1}-{2}",
dataItem.Property1,
dataItem.Property2,
dataItem.Property3));
}
File.WriteAllText("C:\\example.txt", sb.ToString(), new UTF8Encoding(false));
Run Code Online (Sandbox Code Playgroud)
B.使用File.AppendText
using(StreamWriter sw = File.AppendText("C:\\example.txt"))
{
foreach (Data dataItem in Datas)
{
sw.WriteLine(
String.Format(
"{0}, {1}-{2}",
dataItem.Property1,
dataItem.Property2,
dataItem.Property3));
}
}
Run Code Online (Sandbox Code Playgroud)
Jim*_*hel 15
你的第一个版本,将所有内容放入a StringBuilder然后写入,将消耗最多的内存.如果文本非常大,则可能会耗尽内存.它有可能更快,但也可能更慢.
第二个选项将使用更少的内存(基本上,只是StreamWriter缓冲区),并将表现得非常好.我会推荐这个选项.它表现良好 - 可能比第一种方法更好 - 而且没有相同的内存耗尽潜力.
你可以通过增加输出缓冲区的大小来加速它.而不是
File.AppendText("filename")
Run Code Online (Sandbox Code Playgroud)
使用以下命令创建流:
const int BufferSize = 65536; // 64 Kilobytes
StreamWriter sw = new StreamWriter("filename", true, Encoding.UTF8, BufferSize);
Run Code Online (Sandbox Code Playgroud)
缓冲区大小为64K,比默认的4K缓冲区大小提供了更好的性能.你可以做得更大,但我发现大于64K会带来最小的性能提升,而且在某些系统上实际上会降低性能.
使用时,您至少还有一个其他选择 File.AppendAllLines()
var data = from item in Datas
select string.Format("{0}, {1}-{2}", item.Property1, item.Property2, item.Property3);
File.AppendAllLines("Filename", data, new UTF8Encoding(false));
Run Code Online (Sandbox Code Playgroud)
理论上,这将比第一种方法使用更少的内存,因为一次只有一行将被缓冲在内存中.
它可能与你的第二种方法几乎完全相同.我只是向你展示第三种选择.这个的唯一优点是你可以给它一个Linq序列,这有时很有用.
I/O速度将使任何其他考虑因素相形见绌,因此您应该集中精力减少内存使用量,正如juharr所述(当然还要考虑过早优化的危险!)
这意味着使用你的第二种方法,或者我放在这里的方法.
| 归档时间: |
|
| 查看次数: |
10347 次 |
| 最近记录: |