我们在一个复杂的图像处理算法的最后添加了以下代码,以将结果保存到文本文件中。此函数的输入是代表图像处理输出的
通过对这些代码进行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
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);
通过对这些代码进行6000次迭代的运行时间测量,我们得到了以下图表:
![代码运行时间](https://istack.dev59.com/dy2Ux.webp)
它从大约两秒开始,在上升到13秒后,在900次迭代后回落,而(大约)900个周期形成一个循环。正如你所看到的,最高值约为22秒。
有什么想法可以解释运行时间的变化吗?
什么原因会导致这种周期性?
值得一提的是,代码的其他部分也显示出相同的行为,但这部分代码是最容易从源代码中抓取出来的。
更新1:
我已更新代码示例,StringBuilder预先估算了文件大小。我们也考虑了垃圾回收,请考虑以下内容:
900个周期意味着大约3.5小时,处理的输入数据约为16 GB(反复加载相同的图片)。更不用说在图像处理期间由于各种原因创建的副本了。我认为GC应该会更频繁地触发。
16 GB来自:1312 * 3500 * 4 * 900