C#IL代码优化:条件运算符(?:)并重新赋值相同的变量

Ser*_*pov 11 c# optimization cil

我正在阅读C#7.0更改日志并遇到一个显示新元组语法的示例.

private static (int Max, int Min) Range(IEnumerable<int> numbers)
{
    int min = int.MaxValue;
    int max = int.MinValue;
    foreach(var n in numbers)
    {
        min = (n < min) ? n : min;
        max = (n > max) ? n : max;
    }
    return (max, min);
}
Run Code Online (Sandbox Code Playgroud)

如果编译器优化像min = (n < min) ? n : min;原因min = min操作这样的行似乎有点无用,我很好奇.我编译了代码(在发布模式下)并在ILDASM中打开它,看到该min = min任务仍在那里.

编译器跳过作业是一个棘手的问题吗?或许是因为一些多线程问题?

小智 5

条件运算符的工作方式是总是得到一个赋值,因为编译器总是期望'='之后的值.当然编译器可以编写以检查左侧和右侧是否相同,重写变量(从右到左)比使用检查比较两个变量的时间更快,当考虑到大多数情况下,min = min场景不太可能,这只会导致额外的检查,并且99.9%的时间会减慢执行速度.

程序员的工作是确定何时使用条件运算符或简单的if

int min = int.MaxValue;
int max = int.MinValue;
foreach(var n in numbers)
{

    if(n < min) min = n;
    if(n > max) max = n;
}
Run Code Online (Sandbox Code Playgroud)

这样,对于这种情况,可以避免min = min分配.

  • 我同意,但额外检查是否可以删除赋值将由编译器完成一次,而不是在执行期间,你似乎混淆了一点. (2认同)