首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Delphi中,inc(i)和I := i+1之间是否存在性能差异?

在Delphi中,inc(i)和I := i+1之间是否存在性能差异?
EN

Stack Overflow用户
提问于 2008-09-26 12:01:27
回答 6查看 3.7K关注 0票数 14

我有个手术有很多

代码语言:javascript
复制
i := i +1;

在里面我想

代码语言:javascript
复制
 inc(i);

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

编辑:我做了一些性能测量,发现差异非常小,实际上小到5.1222741794670901427682121946224e-8!所以这真的不重要。而且优化选项并没有对结果有多大影响。感谢所有的提示和建议!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-09-26 12:06:39

现代编译器优化了代码。

Inc.(I)和i:= i+1;大同小异。

使用您喜欢的任何一个。

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

票数 7
EN

Stack Overflow用户

发布于 2008-09-27 07:41:12

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

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

票数 17
EN

Stack Overflow用户

发布于 2008-09-26 12:41:02

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

由于Delphi2009可以执行指针数学运算,因此Inc.(I)也可以在类型化指针上执行(如果它们是在打开POINTER_MATH的情况下定义的)。

例如:

代码语言:javascript
复制
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窗口>反汇编

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/138994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档