小编tod*_*rik的帖子

.Net性能周期?

我们在复杂图像处理算法的最后有以下代码,用于将结果保存到文本文件中.函数的输入是float[,] p_RangeMap表示图像处理的输出:

StringBuilder stringBuilder = new StringBuilder(30 * 1024 * 1024);
stringBuilder.AppendLine("Row" + ms_csvSeparator + p_RangeMap.GetLength(0));
stringBuilder.AppendLine("Col" + ms_csvSeparator + p_RangeMap.GetLength(1));

Stopwatch stopwatch = Stopwatch.StartNew();

for (int y = 0; y < p_RangeMap.GetLength(0); y++)
{
     for (int x = 0; x < p_RangeMap.GetLength(1); x++)
     {
          stringBuilder.Append(p_RangeMap[y, x].ToString(CultureInfo.InvariantCulture));
          stringBuilder.Append(ms_csvSeparator);
     }
     stringBuilder.AppendLine();
}

stopwatch.Stop();
Console.WriteLine("MeasureRunTime: RangemapConvert: " + stopwatch.Elapsed);
Run Code Online (Sandbox Code Playgroud)

通过测量6000次迭代的这些行的运行时间,我们得到以下图表:

代码运行时间

6000次迭代大约需要24小时才能运行.横轴表示迭代,而纵轴表示这些行以秒为单位运行的经过时间.每次迭代的输入完全相同,p_RangeMap的维度为1312 x 3500.

它从大约两秒开始,并且在上升到13秒后,它在900次迭代后回落,并且(大约)900个周期形成一个周期.如您所见,最高值约为22秒.

什么可能导致运行时变化的想法?

什么可能导致周期性?

值得一提的是代码的其他部分显示相同的行为,但这部分是最容易从源代码中获取的.

更新1:

我已经更新了代码示例,StringBuilder预先分配了文件大小的粗略估计.我们还考虑过垃圾收集,请考虑以下几点:

900个周期意味着大约3.5小时,大约16 GB的处理输入数据(从文件一次又一次地加载相同的图片).更不用说出于各种原因在图像处理期间创建的副本.我认为GC应该更频繁地触发.

16 GB来自:1312*3500*4*900

.net c# performance

7
推荐指数
2
解决办法
158
查看次数

标签 统计

.net ×1

c# ×1

performance ×1