如何提高配置文件的准确性

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,只在计时时运行我的任务,而不运行其他任何程序?请注意,我不需要像关闭其他运行中的程序或禁用病毒扫描器等显而易见的答案。我标记了这个问题为 Delphi,因为我现在正在使用 Delphi(可能有一些特定于 Delphi 的选项来实现此结果)。我还将其标记为语言无关,因为可能有一些更通用的方法。
更新:由于我正在使用 CPU 指令 RDTSC,所以我不受 CPU 限制的影响。如果 CPU 减速,循环次数保持不变。

更新2
我有两个答案,但都没有回答问题...
问题是如何防止运行时间的变化?我需要运行代码20次,并始终比较这20次运行中最低的运行时间吗?
还是将程序优先级设置为realtime
或者还有其他技巧可以使用,使我的代码示例不会被中断?


2
@TLama:谢谢。另一方面,您的评论通常与最终答案一样有帮助! - MartynA
2个回答

4
想要提高某段代码的运行时间。为此,我首先计时了所有相关代码的运行时间,...。
好的,我会一直重复这个话题,但很多人认为要改善运行时间需要先准确地测量它。
其实不然。
改善运行时间需要找出哪些部分占用了大部分时间(确切的比例并不重要),并通过不同的方法进行处理或者干脆不进行处理。通过计时单独的程序通常无法揭示它正在做什么。 这是我使用的方法,这是一个非常业余的视频。

4
这是我曾经遇到过的最有成效的个人分析建议。我上周使用了这种技巧,取得了巨大成功。 - David Heffernan

3
在编写代码时插入特殊语句进行代码剖析的问题在于,这些特殊语句本身也需要时间来运行。由于耗时最长的可能是在循环中发生的事情,它们运行得越多,就会越扭曲您的定时情况。想要获得好的信息,您需要的是一些可以观察您的程序的东西,而不需要修改正在执行的代码。
换句话说,您需要一个采样分析器。对于 Delphi 来说,有一个非常好的免费采样分析器,名为Sampling Profiler。它运行您的程序并监视其操作,然后将其与映射文件相匹配(请确保设置了项目选项以生成详细映射文件),以便为您提供关于程序花费时间的可读输出。

Enabling the map file

如果你想缩小范围,可以使用OutputDebugString将分析命令输出,以便只关注代码的特定部分。帮助文件中有说明。我尝试了许多不同的方法,这是我发现的最有用的了解Delphi程序在哪里花费时间的方法。而且它是免费的。试试吧。

特殊语句是操作码 rdstc + 一次写入内存。因此,几乎不需要任何周期。但我喜欢分析器能够精确定位占用最多时间的例程。 - Johan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接