我有个手术有很多
i := i +1;在里面我想
inc(i);看起来好多了。是否存在性能差异,或者函数调用只是被编译器内联?我知道这对我的应用程序来说可能一点也不重要,我只是好奇。
编辑:我做了一些性能测量,发现差异非常小,实际上小到5.1222741794670901427682121946224e-8!所以这真的不重要。而且优化选项并没有对结果有多大影响。感谢所有的提示和建议!
发布于 2008-09-26 12:06:39
现代编译器优化了代码。
Inc.(I)和i:= i+1;大同小异。
使用您喜欢的任何一个。
编辑:正如Jim McKeeth更正的那样:使用溢出检查是有区别的。Inc.不执行范围检查。
发布于 2008-09-27 07:41:12
如果打开了溢出检查,则会有很大的不同。基本上,Inc.不会做溢出检查。按照建议执行操作,并使用反汇编窗口查看打开这些编译器选项时的差异(每个选项都不同)。
如果关闭了这些选项,则没有区别。根据经验,当您不关心范围检查失败时,请使用Inc (因为您不会得到异常!)
发布于 2008-09-26 12:41:02
这完全取决于"i“的类型。在Delphi中,人们通常将循环变量声明为"i: Integer",但它也可以是"i: PChar“,它在Delphi2009和FPC以下的所有内容上解析为PAnsiChar (我猜在这里),在Delphi2009和Delphi.NET上解析为PWideChar (也是猜测)。
由于Delphi2009可以执行指针数学运算,因此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窗口>反汇编
请注意,优化、OVERFLOW_CHECKS和RANGE_CHECKS等编译器选项可能会影响最终结果,因此您应该根据自己的喜好进行设置。
关于这一点的提示:在每个单元中,$INCLUDE一个控制编译器选项的文件,这样,当你的.bdsproj或.dproj以某种方式损坏时,你不会丢失设置。(在JCL的源代码中可以找到一个很好的例子)
https://stackoverflow.com/questions/138994
复制相似问题