如何进行代码运行效率实测?
icbm 2006-11-13 05:26:50
我写了一段代码,想知道它的运行效率。因为一段代码的执行时间非差短,我想通过多次执行,最后求平均值的办法来得到代码的执行时间,从而得知代码的运行效率。
伪码是这样:
BeginTime = Now; // 记录起始时间
for (i=0; i< 100000; ++i) // 执行100000次
{
// 要测试运行效率的代码
Test;
}
EndTime = Now; // 记录结束时间
RunTime = (EndTime - BeginTime) / 100000; // 代码的执行时间
可是这样会有几个问题:
1、最后记录的总时间中,既包括了Test运行的时间,也包括了for循环运行的时间。而实际上,我只是想知道Test运行的时间。特别是当Test与for循环运行时间相差不大的时候,误差会比较大。
2、CPU的流水操作会预测指令的执行,for循环过多的跳转会导致CPU预测不准确,从而增加了运行总时间误差。
我修改了伪码,使它变成这样:
BeginTime = Now; // 记录起始时间
for (i=0; i< 10000; ++i) // 执行10000次
{
// 要测试运行效率的代码,运行10次
Test;
Test;
Test;
Test;
Test;
Test;
Test;
Test;
Test;
Test;
}
EndTime = Now; // 记录结束时间
RunTime = (EndTime - BeginTime) / 100000; // 代码的执行时间
我的结论:
1、这样减少了for循环运行的次数,从而减小了for循环执行时间带来的误差。
2、减少了for循环执行的跳转,从而减少for循环的跳转会导致CPU预测不准确的增加的负担。
我得出个结论,尽量减少for的执行次数,会使得到的实测结果更准确。于是最后的伪码成了这样:
BeginTime = Now; // 记录起始时间
// 要测试运行效率的代码,运行100000次
Test;
Test;
Test;
Test;
Test;
Test;
Test;
Test;
Test;
Test;
... ... // Test;共100000行。余下省略
EndTime = Now; // 记录结束时间
RunTime = (EndTime - BeginTime) / 100000; // 代码的执行时间
结果最后的源代码和编译后的可执行程序非常大。不知各位有什么好的办法、建议。欢迎大家指点、讨论。