我的程序正在經歷一個令人討厭的性能下降。它基本上是一對嵌套for循環,它執行一對數據集的操作,然後寫入結果。問題在於,300,000對中的約500對在0.07秒/對到5秒/對之間變慢,並且CPU使用率從接近100%下降到〜4%。所有使用的內存都在嵌套循環之前分配,並在循環之後釋放。與C程序劇烈CPU下降
這裏是僞代碼,這樣你就可以有希望的想法:
for (i=0; i<759; i++) {
read_binary_data(data_file_1, data_1);
read_binary_header(header_file_1, header_1);
for (j=i+1; j<760;j++) {
read_binary_data(data_file_2, data_2);
read_binary_header(header_file_2, header_2);
do_operation(data_1, data_2, out_data);
update_header_data(header_1, header_2, out_header);
write_binary_data_and_header(out_data, out_header);
}
}
我已經把時序標誌的開頭和第二個for循環看到上面引述的時機結束,但我想知道如果可能有更好的調試選項來顯示操作速度減慢的原因。到目前爲止我唯一的想法是文件系統阻塞,但是我只在每次運行時打開5-6個文件,每個文件在其子程序結束時都關閉。
下午10點15分更新太平洋時間:
經過各種測試,我發現罪魁禍首似乎是在read_binary_data部分。許多文件可能需要3秒以上。我將嘗試將所有二進制數據打包到一個文件中並一次讀取,因此我只需要讀取一個。我敢打賭我會用完內存,但它值得一試,如果發生這種情況,我就不那麼雄心勃勃,並且嘗試每次少於760 * 2 * 31 * 43201浮點數組我想這應該在16 GB左右?)。
「但我只在每次運行時打開5-6個文件,每個文件在子程序結束時都關閉」 - 這怎麼證明它不是文件系統阻塞? – nos 2010-08-03 21:45:14
我想它並不能證明它,但我認爲我嘗試打開文件的次數越少,阻止文件系統的可能性就越小。 – robporritt 2010-08-03 21:48:54