为了我第一次使用所有相关代码的运行时间,使用如下代码:
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表示避免除以零错误)
注意运行A和运行B之间的区别.
我还没有改变任何东西,所以运行A和B应该给出相同的运行时间.
进一步请注意,我知道在两次运行中,程序部分的调用次数完全相同(数据相同且算法具有确定性).
程序部分的运行时间很短(只需多次调用).
如果在这些短暂的运行时间(少于700个CPU周期)中有某种方法可以阻止其他进程,那么我的计时会更准确.
如何让这些时间更可靠?
有没有办法垄断CPU只在定时时运行我的任务而没有别的?
请注意,我不是在寻找明显的答案,例如:
– 关闭其他正在运行的程序
– 禁用virusscanner等……
我已经标记了Delphi的问题,因为我现在正在使用Delphi(并且可能有一些特定于Delphi的选项来实现这个结果).
我还标记了它与语言无关,因为可能有一些更通用的方法.
更新
因为我正在使用CPU指令RDTSC,所以我不受CPU限制的影响.如果CPU减速,则循环次数保持不变.
UPDATE2
我有2个答案,但都没有回答这个问题……
问题是如何防止这些运行时间的变化?
我是否必须运行代码20x并始终比较20次运行中的最低运行时间?
或者我将程序优先级设置为实时?
还是有其他一些技巧可以使用,所以我的代码示例不会被中断?
To want to improve the running time of some code.
In order to that I first time the running time of all relevant code, …
好吧,我在这个问题上有点记录,但很多人认为改善运行时间需要先准确测量.
不是这样.
改善运行时间需要找出需要花费很长时间的时间(确切的分数无关紧要)并且不同地做或者根本不做.
它的作用往往不是通过计时个别例程来揭示的.
Here’s the method I use,
和here’s a very amateur video of it.