首页 > 解决方案 > 如何提高循环效率

问题描述

我正在尝试将我的数据保存到 csv 文件。当速率很小(保存 2,000/s)时,它工作得很好。但是当增加到20,000 / s时,它的工作速度很慢。

class Channel 
{
    List<double> RawData { get; set; }
    ...
}

-----------------------------------

var channels = new List<Channel>();
// after fetch the data
var sw = new StreamWriter(FileStream, Encoding.Default);
for (i = 0; channels.First().RawData.Count; i ++)
{
    string line = DateTime.Now.ToString() + ",";
    line += string.Join(',', channels.Select(c => c.RawData[i]));
    sw.WriteLine(line);
    sw.Flush();
}

RawData每个的计数channel达到 20,000 时,应用程序将运行缓慢。有什么办法可以加快生成速度line吗?

标签: c#loops

解决方案


您可以采取一些措施来加快速度。

通常,I/O 操作是昂贵的(最慢的),所以尽量避免做很多,而是只写一次或几次。

当您多次执行此操作时,修改字符串也很慢。因此,您应该使用 StringBuilder。

最后,在我看来,您使用的日期时间在许多情况下(但可能不是全部!)都是相同的值。如果是这种情况,那么您可以只调用一次,然后输出相同的值。

您也许还可以加快频道 Select 语句(根据其他帖子)。

那么你会有这样的代码:

StringBuilder sb = new StringBuilder();
string dtValue = DateTime.Now.ToString();

for (int i = 0; channels.First().RawData.Count; i++)
{
    sb.Append(dtValue).Append(",").Append(channels.First().RawData[i]).Append(Environment.NewLine);    
}

//Write just once.
using (var sw = new StreamWriter(FileStream, Encoding.Default))
{
    sw.Writeline(sb.ToString());
    sw.Close();
}

编辑:根据评论更新为使用 channels.First().RawData[i]。


推荐阅读