与返回值的方法相比,void方法最基本的更快/更少的开销吗?

Mr.*_*Mr. 2 .net c# il cil

我无法在SO或互联网上找到类似的问题/答案,并且这个问题可能无用,这可能是我在MSIL上阅读时遇到的一个问题.我非常好奇理解IL操作执行在我的场景中是如何工作的,即使这不是一个我没有其他人要问的实际问题.

前提:

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

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

步骤1和3是可选的.例如,void函数不会将返回值推送到堆栈.

我知道这是一种方法确定需要多少"处理能力"的方法,但为了我的好奇心,我们可以考虑这两个非常基本的方法:

第一种方法:

void Method1()
{
  var result = 1+1;
}
Run Code Online (Sandbox Code Playgroud)

第二种方法:

int Method2()
{
  var result = 1+1;
  return result;
}
Run Code Online (Sandbox Code Playgroud)

题:

因为void方法不会推送返回值(或者是否存在隐式返回)这是否意味着在执行时需要较少的开销而不是第二种方法?

Jim*_*hel 6

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

在最基本的级别,函数返回寄存器中的值.假设寄存器足够大.让我们坚持使用64位值(引用,长整数,双精度和较小值类型).这些可以在RAX寄存器中返回.在您的简单示例中,两个函数的生成机器代码没有区别.那就是Method1:

mov rax, 1
inc rax
ret
Run Code Online (Sandbox Code Playgroud)

(是的,我知道,一个聪明的编译器将崩溃1+12.让我们假设有一个内存访问那里,好吗?)

Method2 将是相同的,因为要返回的值已经在RAX寄存器中.

因此,当您使用64位或更小的数量时,返回值的方法与不返回值的方法之间的差异通常会有所不同,如果有的话,只会在加载数据的任何指令中有所不同.将值返回到正确的寄存器中.这通常是单个mov指令.这将取决于事情的完成顺序,以及编译器和JITer如何优化事物.