2013-09-24 66 views
3

我想提高一些代码的运行时间。如何提高性能分析的准确性

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

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特定选项来实现此结果)。 我也标记了语言不可知因为可能有一些更一般的方法。

更新
因为我使用的是我没有受到CPU节流的CPU指令RDTSC。如果CPU速度变慢,则周期数保持不变。

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

+2

@TLama:Tks。奥托,你的意见通常与最终答案一样有用! – MartynA

回答

4

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

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

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

并非如此。

提高运行时间需要找出需要花费很大一部分时间(精确的部分无关紧要),并以不同的方式执行,或者根本不执行。 它做什么往往没有透露计时的个别例​​程。

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

+4

+1这是我遇到过的最高效的性能分析建议。上周我使用了这种非常成功的技术。 –

3

通过在其中添加特殊语句来分析代码的问题是,这些特殊语句本身需要时间才能运行。而且,因为花费最多时间的事情可能是事情发生在紧密的循环中,所以他们跑得越多,他们越扭曲你的计时。你需要获得良好的信息,这将会从外部观察你的程序而不修改执行代码。

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

Enabling the map file

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

我已经使用了很多不同的方法,这是我发现找出什么德尔菲计划花费他们的时间的最有用的方法。它是免费的。试一试。

+0

特殊语句是操作码'rdstc' +一次写入内存。所以几乎不需要任何周期。但我喜欢探查器查明花费最多时间的例程。 – Johan

+0

我不知道'回合这个特别的分析器。 – Johan