我的程序正在经历一个令人讨厌的性能下降。它基本上是一对嵌套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