呼叫方法会降低性能吗?

Jat*_*ing 6 c# performance jit

例如:
代码1:

void Main()
{
    Console.WriteLine("Some texts");
}
Run Code Online (Sandbox Code Playgroud)

代码2:

void Main()
{
    Foo();
}

void Foo()
{
    Console.WriteLine("Some texts");
}
Run Code Online (Sandbox Code Playgroud)

代码2运行速度比代码1慢吗?我虽然在构建版本时,JIT将内联代码2,然后代码2将以代码1的速度运行.但是当我使用LinqPad测试它时,我得到了IL结果:

代码1:

IL_0000:  ldstr       "Some texts"
IL_0005:  call        System.Console.WriteLine
Run Code Online (Sandbox Code Playgroud)

代码2:

IL_0000:  ldarg.0     
IL_0001:  call        UserQuery.Foo

Foo:
IL_0000:  ldstr       "Some texts"
IL_0005:  call        System.Console.WriteLine
IL_000A:  ret      
Run Code Online (Sandbox Code Playgroud)

我们可以看到代码2中的IL结果有一些额外的步骤来调用Foo(),这是否证明代码2比代码1运行得慢?

jas*_*son 10

首先,您正在查看IL,而不是JITted汇编代码.你所展示的并不能证明什么.您需要查看JITted输出以查看JITter是否内联了代码.请注意,JITter从平台到平台(例如x86与x64)以及Framework的版本与Framework版本不同.

其次,当然,由于书面版本2的运行速度比版本1慢.当我说"as written"时,我的意思是假设JITter没有在第二版中内联调用.额外的调用添加了一些机器指令,当然需要几个额外的周期来执行(再次,不要忘记我说"写的!").然而,性能上的差异非常极大,不太可能有意义.您必须在最紧密的循环中进行数万亿次和数万亿次迭代才能看到有意义的性能差异.

  • 如果你真的想知道,编译这两个版本,将它们推过JITter并查看输出的程序集. (4认同)