我想改善一些代码的运行时间。
为了我第一次使用所有相关代码的运行时间,使用这样的代码:
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,只在定时时运行我的任务?
<子>
请注意,我不是在寻找明显的答案,例如:
- 关闭其他正在运行的程序
- 禁用virusscanner等......
子>
我已经标记了问题 Delphi ,因为我现在正在使用Delphi(并且可能有一些特定于Delphi的选项来实现此结果)。 我还标记了语言无关,因为可能有一些更通用的方法。
更新
因为我正在使用CPU指令RDTSC
我不受CPU限制的影响。如果CPU减速,则循环次数保持不变。
UPDATE2
我有2个答案,但都没有回答这个问题......
问题是如何防止这些运行时间的变化?
我是否必须运行代码20x并始终比较20次运行中的最低运行时间?
或者我将我的计划优先级设置为realtime
?
还是有其他一些技巧可以使用,所以我的代码示例不会被中断?
答案 0 :(得分:4)
想要改善某些代码的运行时间。
为了我第一次使用所有相关代码的运行时间,......
好的,我在这个问题上有点记录,但很多人认为改善运行时间需要先准确测量。
不是。
改善运行时间需要找出占用大部分时间的东西(确切的分数无关紧要),并以不同方式或根本不做。 它的作用通常不是通过计时个别例程来揭示的。
Here's the method I use, 和here's a very amateur video of it。
答案 1 :(得分:3)
通过在其中添加特殊语句来分析代码的问题在于,这些特殊语句本身需要时间来运行。而且由于花费最多时间的事情可能是紧密循环中发生的事情,它们运行得越多,它们就越会扭曲你的时间。您需要的信息才能从外部观察您的程序,而无需修改执行代码。
换句话说,您需要一个采样分析器。对于免费提供的Delphi来说恰好是一个非常好的,可以用相当描述性的名称Sampling Profiler。它运行你的程序并观察它正在做什么,然后将其与地图文件相关联(确保设置项目选项以生成详细的地图文件),以便为您提供关于程序花费时间的可理解读数。 / p>
如果您想缩小范围,可以使用OutputDebugString输出分析命令,使其仅关注代码的特定部分。它在帮助文件中有说明。
我使用了很多不同的方法,这是我发现的最有用的方法,可以找出Delphi程序花费的时间。它是免费的。试一试。