gpt4 book ai didi

c# - void 方法在最基本的情况下是否比返回值的方法更快/更少开销?

转载 作者:行者123 更新时间:2023-11-30 19:29:29 29 4
gpt4 key购买 nike

我在 SO 或互联网上都找不到类似的问题/答案,而且这个问题毫无用处,也许这是我在阅读 MSIL 时想到的一个问题。我非常想了解 IL 操作执行在我的场景中是如何工作的,即使这不是一个我没有其他人可以问的实际问题。

前提:

请记住,MSIL 命令和函数的执行分三步完成:

  1. 将命令操作数或函数参数压入堆栈。
  2. 执行MSIL 命令或调用函数。命令或函数从堆栈中弹出它们的操作数(参数)并将结果(返回值)压入堆栈。
  3. 从堆栈中读取结果。

第 1 步和第 3 步是可选的。例如,void 函数不会将返回值压入堆栈。

我知道方法的作用决定了需要多少“处理能力”,但出于好奇,让我们考虑一下这两种非常基本的方法:

第一种方法:

void Method1()
{
var result = 1+1;
}

第二种方法:

int Method2()
{
var result = 1+1;
return result;
}

问题:

因为 void 方法不推送返回值(或者有隐式返回),这是否意味着与第二种方法相比,它在执行时需要更少的开销?

最佳答案

不过请记住,MSIL 不会被执行,甚至不会被解释。 MSIL 是在虚拟机上执行的已编译代码的表达式。但是 JIT 编译器将 MSIL 转换为机器代码(x86 等)。 x86 从根本上不同于基于堆栈的虚拟机。

在最基本的层面上,函数返回寄存器中的值。假设寄存器足够大。让我们坚持使用 64 位值(引用、长整型、 double 和更小的值类型)。这些可以在 RAX 寄存器中返回。在您的简单示例中,这两个函数生成的机器代码没有区别。也就是说,Method1 将是:

mov rax, 1
inc rax
ret

(而且,是的,我知道智能编译器会将 1+1 折叠为 2。我们假设那里有内存访问,好吗?)

方法 2 是相同的,因为要返回的值已经在 RAX 寄存器中。

因此,当您处理 64 位或更小的数量时,返回值的方法和不返回值的方法之间的区别通常会有所不同,如果有的话,仅在所采用的指令上有所不同将返回值加载到正确的寄存器中。这通常是单个 mov 指令。这将取决于事情的完成顺序,以及编译器和 JITer 优化事情的程度。

关于c# - void 方法在最基本的情况下是否比返回值的方法更快/更少开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12200662/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com