- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
将Integer
转换为字符串时,
。哪个更快?IntToStr()
和Integer.ToString()
之间的基本区别是什么
var
VarInt: integer;
VarStr: string;
begin
VarInt := 5;
VarStr := IntToStr(VarInt);
VarStr := VarInt.ToString;
end;
最佳答案
免责声明:以下文本包含仅适用于 Delphi 10.2.1(以及 10.2.2)的详细信息,这似乎使内联和 RVO 变得更糟:
编译器生成的代码确实有所不同(无论编译器版本如何),正如您在查看反汇编窗口时可以轻松看到的那样。
让我们看一下这个例程:
procedure Main;
var
i: Integer;
s: string;
begin
i := 0;
s := IntToStr(i);
s := i.ToString;
end;
现在让我们运行它并查看反汇编窗口以检查编译器生成的代码:
这就是 Delphi 10.1 带来的结果:
Project1.dpr.14: s := IntToStr(i);
00419810 8D55F8 lea edx,[ebp-$08]
00419813 8B45FC mov eax,[ebp-$04]
00419816 E80DA4FFFF call IntToStr
Project1.dpr.15: s := i.ToString;
0041981B 8D55F4 lea edx,[ebp-$0c]
0041981E 8B45FC mov eax,[ebp-$04]
00419821 E802A4FFFF call IntToStr
00419826 8D45F8 lea eax,[ebp-$08]
00419829 8B55F4 mov edx,[ebp-$0c]
0041982C E843D2FEFF call @UStrLAsg
这就是您在 10.2.1(以及 10.2.2)中得到的结果:
Project1.dpr.14: s := IntToStr(i);
00419B04 8D55F8 lea edx,[ebp-$08]
00419B07 8B45FC mov eax,[ebp-$04]
00419B0A E8C5A2FFFF call IntToStr
Project1.dpr.15: s := i.ToString;
00419B0F 33C0 xor eax,eax
00419B11 55 push ebp
00419B12 68499B4100 push $00419b49
00419B17 64FF30 push dword ptr fs:[eax]
00419B1A 648920 mov fs:[eax],esp
00419B1D 8D55F4 lea edx,[ebp-$0c]
00419B20 8B45FC mov eax,[ebp-$04]
00419B23 E8ACA2FFFF call IntToStr
00419B28 8D45F8 lea eax,[ebp-$08]
00419B2B 8B55F4 mov edx,[ebp-$0c]
00419B2E E805D0FEFF call @UStrLAsg
00419B33 33C0 xor eax,eax
00419B35 5A pop edx
00419B36 59 pop ecx
00419B37 59 pop ecx
00419B38 648910 mov fs:[eax],edx
00419B3B 68509B4100 push $00419b50
00419B40 8D45F4 lea eax,[ebp-$0c]
00419B43 E8D4CCFEFF call @UStrClr
00419B48 C3 ret
00419B49 E9CEC3FEFF jmp @HandleFinally
00419B4E EBF0 jmp $00419b40
现在最重要的问题是,那些额外的指令是什么?!
您在两个编译器中看到的额外指令是缺少所谓的返回值优化的结果。您可能知道,编译器将托管类型(如字符串)的函数结果视为隐藏的 var 参数。现在,当编译器进行内联时,它不会消除此参数,而是直接将 s
变量传递给 IntToStr
,就像直接调用它时一样。它而是保留一个临时变量,用于传递给 IntToStr,然后将该变量分配给 s(即调用 @UStrLAsg)您会看到 IntToStr
调用后有 3 行)。
正如我上面提到的,10.2 或 10.2.1 中似乎存在回归,他们在内联调用之后更改了有关临时变量清理的一些内容(这是之前和之后的额外指令)。
报告为RSP-19439 .
未完待续...
关于Delphi编译器IntToStr()和Integer.ToString()之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47517860/
这是学校的任务,我应该编写一个递归函数,将给定的 int 转换为字符串,我知道我很接近,但我无法指出我的代码中缺少的东西,欢迎提示. void intToStr(unsigned int num, c
尝试在 showmessage 弹出窗口中打印索引会出现编译时错误。 [dcc32 Error] Unit.pas(57): E2003 Undeclared identifier: 'IntToSt
我想知道是否有比 System.IntToStr/System.StrToInt 更快的替代方案。有一个快速版本,但只有 UTF8。这是来自 SynCommons.pas 的 Int32ToUTF8,
这个问题已经有答案了: String valueOf vs concatenation with empty string (10 个回答) 已关闭 7 年前。 有几个人告诉我这样的事情非常懒: in
public static final int MAX_DIGITS = 10; String intToStr( int num ){ int i = 0; boolean isNe
我可以在 C++Builder 6 中成功编译以下代码片段,但我无法在 RAD Studio Seattle 中编译它: unsigned long x = 50; String s = In
我是一名优秀的程序员,十分优秀!