C#IL代码优化:条件运算符(?:)和相同变量的重新分配

时间:2018-07-12 05:28:33

标签: c# optimization cil

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

layoutIfNeeded

我很好奇编译器是否优化了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); } 之类的行,导致min = (n < min) ? n : min;操作似乎没有用。我编译了代码(在发布模式下),并在ILDASM中将其打开,然后看到min = min分配仍然存在。

对于编译器而言,跳过分配任务是个棘手的问题吗?还是因为某些多线程问题?

1 个答案:

答案 0 :(得分: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;
}

在这种情况下,可以避免使用min = min分配。