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分配.
| 归档时间: |
|
| 查看次数: |
218 次 |
| 最近记录: |