在複雜的圖像處理算法的最後,我們有以下代碼將結果保存到文本文件。該函數的輸入是一個float[,] p_RangeMap
表示圖像處理的輸出:.net性能週期?
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次的迭代的運行時,我們得到了如下圖:
6000迭代大約需要24小時才能運行。水平軸表示迭代,垂直軸表示這些線以秒計算的運行時間。輸入對於每次迭代完全相同,並且p_RangeMap的尺寸是1312 x 3500.
它從大約兩秒開始,並且在上升到13秒之後,在900次迭代之後回落,並且(大約)900個週期形成一個週期。正如你所看到的最高值約爲22秒。
任何想法可能導致這種運行時變化?
什麼可能導致週期性?
可能值得一提的是,代碼的其他部分顯示了相同的行爲,但是這部分是從源代碼中最容易獲取的。
UPDATE1:
我已經更新了代碼示例中,StringBuilder的是預分配與文件大小的一個粗略的估計。我們也考慮過垃圾回收,請考慮以下事項:
900個週期意味着大約3.5小時,大約16 GB的處理後的輸入數據(從文件一次又一次地加載相同的圖片)。更不用說因爲各種原因在圖像處理過程中創建的副本。我認爲GC應該更頻繁地觸發。
16 GB來源於:1312 * 3500 * 4 * 900
考慮到操作涉及分配,我希望垃圾收集... –
考慮預先分配的StringBuilder - 我認爲結果是相當大的,如果它有它的效率不高經常擴大規模。如果結果進入一個文件,請考慮在一個較小的stringbuilder中逐行輸出它 - 這看起來像gc問題,這是一個可能的原因。 – TomTom
我已經更新了這個問題,StringBuilder是預先分配的。逐行輸出這些線條聽起來很有意思,我們可以嘗試。將更新與結果的職位。 – toderik