0

如前所述,我很好奇这样做是否有任何好处:

return someNumber = CalculateResults(parameter);

与做:

someNumber = CalculateResults(parameter);
return someNumber;

或做:

return CalculateResults(parameter);

使用其中一种是否有任何性能提升?

4

4 回答 4

2

虽然使用主动优化可能所有三个都是相同的,但如果没有,它们会产生略微不同的结果。

第一个和第二个必须在范围内声明一个变量并返回它,而最后一个不需要。我试图编译以下程序:

int Calculate()
{
    return 42;
}

int FirstCase()
{
    int x;
    return x = Calculate();
}

int SecondCase()
{
    var x = Calculate();
    return x;
}

int ThirdCase()
{
    return Calculate();
}

使用 LINQPad 输出:

FirstCase:
IL_0000:  nop         
IL_0001:  ldarg.0     
IL_0002:  call        UserQuery.Calculate
IL_0007:  dup         
IL_0008:  stloc.0     // x
IL_0009:  stloc.1     // CS$1$0000
IL_000A:  br.s        IL_000C
IL_000C:  ldloc.1     // CS$1$0000
IL_000D:  ret         

SecondCase:
IL_0000:  nop         
IL_0001:  ldarg.0     
IL_0002:  call        UserQuery.Calculate
IL_0007:  stloc.0     // x
IL_0008:  ldloc.0     // x
IL_0009:  stloc.1     // CS$1$0000
IL_000A:  br.s        IL_000C
IL_000C:  ldloc.1     // CS$1$0000
IL_000D:  ret         

ThirdCase:
IL_0000:  nop         
IL_0001:  ldarg.0     
IL_0002:  call        UserQuery.Calculate
IL_0007:  stloc.0     // CS$1$0000
IL_0008:  br.s        IL_000A
IL_000A:  ldloc.0     // CS$1$0000
IL_000B:  ret         

第三种情况稍微短一些。我也更喜欢这种方法,因为它感觉比为其分配变量更流畅。我使用变量的唯一原因是尝试通过变量为返回值提供一个有意义的名称来“记录”该方法的作用。

于 2013-01-15T15:33:59.470 回答
1

前两者之间没有实际的好处,但在我看来,第二个比第一个更具可读性。

return CalculateResults(parameter);

如果不以任何方式坚持,那就更好someNumber了,你应该小心。

并且少了一条指令(尽管如果优化器已经为你做了那我不会感到惊讶)

于 2013-01-15T15:32:29.390 回答
1

像 Jacob 所说的那样,在单独的行上将有助于调试。如果您不需要存储/操作返回的数据,那么您应该继续并返回而不分配变量。

于 2013-01-15T15:34:04.607 回答
0

我更喜欢这个

return someNumber = CalculateResults(parameter); 

若有可能。节省一行并在您调试时提供帮助。您可以简单地将鼠标悬停在 someNumber 上以获取返回值。

如果不进行分配操作,性能增益(如果有的话)可以忽略不计。(无论如何,编译器可能会对其进行优化。)

于 2013-01-15T15:34:17.800 回答