我希望改进一些代码的运行时间。
为此,我首先对所有相关代码进行了计时,使用了像下面这样的代码:
更新:由于我正在使用 CPU 指令 RDTSC,所以我不受 CPU 限制的影响。如果 CPU 减速,循环次数保持不变。
before:= rdtsc;
myobject.run;
after:= rdtsc;
然后我放大并计时相关部分,就像这样:
procedure myobject.part;
begin
StartTime:= rdtsc;
...
EndTime:= rdtsc;
inc(TotalTime, (EndTime- StartTime));
end;
我有一些代码可以复制粘贴到Excel中,典型的结果如下:
(89.8%和10.2%加起来等于100%是巧合,与数据或问题无关)
(当数据显示1
时,意味着0
,以避免除零错误)
请注意run A
和run B
之间的差异。
我还没有做出任何更改,因此运行A和B应该给出相同的运行时间。
进一步注意,我知道在两个运行中都恰好调用了part
过程相同次数(数据相同,算法是确定性的)。
part
过程的运行时间非常短(只被调用了很多次)。
如果有一种方法可以在这些短暂的运行时间内阻止其他进程(少于700个CPU周期),我的计时将会更准确。
更新:由于我正在使用 CPU 指令 RDTSC,所以我不受 CPU 限制的影响。如果 CPU 减速,循环次数保持不变。
更新2
我有两个答案,但都没有回答问题...
问题是如何防止运行时间的变化?我需要运行代码20次,并始终比较这20次运行中最低的运行时间吗?
还是将程序优先级设置为realtime
?
或者还有其他技巧可以使用,使我的代码示例不会被中断?