如何提高分析的准确性

时间:2013-09-24 14:12:57

标签: delphi language-agnostic profiling

我想改善一些代码的运行时间。

为了我第一次使用所有相关代码的运行时间,使用这样的代码:

before:= rdtsc;
myobject.run;
after:= rdtsc;

然后我放大并计时相关部分,如下:

procedure myobject.part;
begin
  StartTime:= rdtsc;
  ...
  EndTime:= rdtsc;
  inc(TotalTime, (EndTime- StartTime));
end;

我有一些代码可以将时间复制粘贴到Excel中,典型结果如下:

Timing difference should not be there
(89.8%和10.2%加起来100%是巧合,与数据或问题无关)
(当数据显示1时,它意味着0以避免除以零错误)

请注意run Arun B之间的区别 我没有更改任何尚未,因此运行A和B应该提供相同的运行时间。
进一步请注意,我知道在两次运行中,过程part的调用次数完全相同(数据相同且算法具有确定性)。

程序part的运行时间非常短(只需多次调用) 如果在这些短暂的运行时间(少于700个CPU周期)中有某种方法可以阻止其他进程,那么我的时间会更准确。

如何让这些时间更可靠?
有没有办法独占CPU,只在定时时运行我的任务?

<子> 请注意,我不是在寻找明显的答案,例如:
- 关闭其他正在运行的程序
- 禁用virusscanner等......

我已经标记了问题 Delphi ,因为我现在正在使用Delphi(并且可能有一些特定于Delphi的选项来实现此结果)。 我还标记了语言无关,因为可能有一些更通用的方法。

更新
因为我正在使用CPU指令RDTSC我不受CPU限制的影响。如果CPU减速,则循环次数保持不变。

UPDATE2
我有2个答案,但都没有回答这个问题...... 问题是如何防止这些运行时间的变化? 我是否必须运行代码20x并始终比较20次运行中的最低运行时间? 或者我将我的计划优先级设置为realtime
还是有其他一些技巧可以使用,所以我的代码示例不会被中断?

2 个答案:

答案 0 :(得分:4)

  

想要改善某些代码的运行时间。

     

为了我第一次使用所有相关代码的运行时间,......

好的,我在这个问题上有点记录,但很多人认为改善运行时间需要先准确测量。

不是。

改善运行时间需要找出占用大部分时间的东西(确切的分数无关紧要),并以不同方式或根本不做。 它的作用通常不是通过计时个别例程来揭示的。

Here's the method I use,here's a very amateur video of it

答案 1 :(得分:3)

通过在其中添加特殊语句来分析代码的问题在于,这些特殊语句本身需要时间来运行。而且由于花费最多时间的事情可能是紧密循环中发生的事情,它们运行得越多,它们就越会扭曲你的时间。您需要的信息才能从外部观察您的程序,而无需修改执行代码。

换句话说,您需要一个采样分析器。对于免费提供的Delphi来说恰好是一个非常好的,可以用相当描述性的名称Sampling Profiler。它运行你的程序并观察它正在做什么,然后将其与地图文件相关联(确保设置项目选项以生成详细的地图文件),以便为您提供关于程序花费时间的可理解读数。 / p>

Enabling the map file

如果您想缩小范围,可以使用OutputDebugString输出分析命令,使其仅关注代码的特定部分。它在帮助文件中有说明。

我使用了很多不同的方法,这是我发现的最有用的方法,可以找出Delphi程序花费的时间。它是免费的。试一试。