3

我想提高一些代码的运行时间。

为了让我第一次了解所有相关代码的运行时间,使用如下代码:

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 只在计时时运行我的任务而不是别的?

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

我已经标记了这个问题Delphi,因为我现在正在使用 Delphi(并且可能有一些 Delphi 特定的选项来实现这个结果)。我也标记了它,language-agnostic因为可能有一些更通用的方式。

更新
因为我使用的是 CPU 指令RDTSC,所以我不受 CPU 限制的影响。如果 CPU 变慢,则周期数保持不变。

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

4

2 回答 2

4

想提高一些代码的运行时间。

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

好的,我在这个主题上有点卡住了,但是很多人认为要提高运行时间,首先需要准确地测量它。

不是这样。

提高运行时间需要找出占用大部分时间的内容(确切的部分无关紧要),并以不同的方式或根本不做。它在做什么通常不会通过计时个别例程来揭示。

这是我使用的方法,是一个非常业余的视频

于 2013-09-24T14:43:36.467 回答
3

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

换句话说,您需要一个采样分析器。恰好有一个非常好的 Delphi 免费提供,其名称为Sampling Profiler。它运行您的程序并观察它在做什么,然后将其与地图文件相关联(确保设置您的项目选项以生成详细的地图文件),以便让您清楚地了解您的程序花费的时间。

启用地图文件

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

我使用了很多不同的方法,这是我发现的最有用的方法,可以弄清楚 Delphi 程序将时间花在什么上面。它是免费的。试试看。

于 2013-09-24T15:02:02.877 回答