【问题标题】:Is there a performance difference between inc(i) and i := i + 1 in Delphi?在 Delphi 中 inc(i) 和 i := i + 1 之间是否存在性能差异?
【发布时间】:2010-09-13 10:21:17
【问题描述】:

我有一个程序有很多

i := i +1;

在其中,我认为

 inc(i);

看起来好多了。是否存在性能差异或函数调用只是被编译器内联?我知道这对我的应用来说可能根本不重要,我只是好奇。

编辑:我对性能进行了一些测量,发现差异非常小,实际上小到 5.1222741794670901427682121946224e-8!所以真的没关系。优化选项确实并没有太大改变结果。感谢所有提示和建议!

【问题讨论】:

  • "5.1222741794670901427682121946224e-8"?? “5.12e-8”有什么问题? :-) 我想不出任何需要 32 位有效数字的实际应用,也想不出任何有一半正确数字的测量。 “数学家想要 pi 到 10 亿位,对工程师来说 pi 等于 3.14”
  • 呵呵,好吧,我做了一个测试,结果就是这样,所以我只是剪切并粘贴了它,因此位数很多:)

标签: performance delphi


【解决方案1】:

如果打开溢出检查,会有很大的不同。基本上Inc做溢出检查。按照建议进行操作,并使用反汇编窗口查看打开这些编译器选项时的差异(每个选项都不同)。

如果关闭这些选项,则没有区别。经验法则,当您不关心范围检查失败时使用 Inc(因为您不会得到异常!)。

【讨论】:

  • 这似乎不正确。当此选项打开时, Inc() 进行 溢出检查。在 D2007 和 XE8 中测试。所以Inc(i)i := i + 1之间绝对没有区别。
【解决方案2】:

现代编译器优化代码。
inc(i) 和 i:= i+1;都差不多。

使用你喜欢的任何一个。

编辑:正如 Jim McKeeth 更正的那样:溢出检查是有区别的。 Inc 不进行范围检查。

【讨论】:

  • 错了!开启Range Checking或者Overflow checks看看反汇编!
【解决方案3】:

这完全取决于“i”的类型。在Delphi中,通常将循环变量声明为“i:Integer”,但也可以是“i:PChar”,它在Delphi 2009和FPC(我猜这里)和PWideChar上解析为PAnsiChar Delphi 2009 和 Delphi.NET(也是猜测)。

由于 Delphi 2009 可以进行指针数学运算,因此 Inc(i) 也可以在类型指针上完成(如果它们是在 POINTER_MATH 开启的情况下定义的)。

例如:

type
  PSomeRecord = ^RSomeRecord;
  RSomeRecord = record
    Value1: Integer;
    Value2: Double;
  end;

var
  i: PSomeRecord; 

procedure Test;
begin
  Inc(i); // This line increases i with SizeOf(RSomeRecord) bytes, thanks to POINTER_MATH !
end;

正如其他回答者已经说过的那样:通过打开来查看编译器对您的代码的构成相对容易:

视图 > 调试窗口 > CPU 窗口 > 反汇编

请注意,OPTIMIZATION、OVERFLOW_CHECKS 和 RANGE_CHECKS 等编译器选项可能会影响最终结果,因此您应注意根据自己的喜好进行设置。

关于此的提示:在每个单元中,$INCLUDE 一个控制编译器选项的文件,这样,当您的 .bdsproj 或 .dproj 以某种方式损坏时,您不会丢失设置。 (查看 JCL 的源代码以获取有关此方面的一个很好的示例)

【讨论】:

    【解决方案4】:

    您可以在调试时在 CPU 窗口中进行验证。两种情况下生成的 CPU 指令是相同的。

    我同意 Inc(I); 看起来更好,尽管这可能是主观的。

    更正:我刚刚在 Inc 的文档中找到了这个:

    “在某些平台上,Inc 可能会生成 优化的代码,在 紧密的循环。”

    所以最好还是坚持 Inc.

    【讨论】:

      【解决方案5】:

      您总是可以编写两段代码(在单独的过程中),在代码中设置断点并在 CPU 窗口中比较汇编程序。

      一般来说,我会在明显仅用作某种循环/索引的地方使用 inc(i),而在 1 使代码更易于维护的地方使用 + 1(即,可以想象更改为未来的另一个整数)或从算法/规范的角度来看更具可读性。

      【讨论】:

        【解决方案6】:

        “在某些平台上,Inc 可能会生成优化的代码,在紧密循环中尤其有用。” 对于优化的编译器,如 Delphi,它并不关心。那是关于旧的编译器(例如 Turbo Pascal)

        【讨论】:

          猜你喜欢
          • 2010-10-02
          • 2012-09-12
          • 1970-01-01
          • 1970-01-01
          • 2020-05-24
          • 1970-01-01
          • 1970-01-01
          • 2016-11-14
          • 1970-01-01
          相关资源
          最近更新 更多