【发布时间】:2013-01-23 00:54:19
【问题描述】:
给定以下代码:
const int constA = 10;
const int constB = 10;
function GetX(int input) {
int x = constA * constB * input;
...
return x;
}
.Net 编译器是否会“替换”表达式并放入 1000,这样计算就不会一遍又一遍地重复?
在什么情况下代码运行最快:
int x = constA * constB * input;int x = 10 * 10 * input;int x = 100 * input;
我猜选项 3 会比 2 更快,但有时不是最易读的选项。编译器会识别出这样的模式并进行相应的优化吗?
【问题讨论】:
-
你的意思是把 '100' 而不是 '1000' :) 你能不能用 ILSpy 来检查这个?
-
在一天结束时,您仍然需要乘以变量
input,这将是瓶颈。那何必呢? -
给定的问题被简化以快速显示问题。我当然可以给你类等的完整继承……但我选择不这样做。
-
题外话,如果你多次调用
GetX方法,你可以通过去掉x变量并使用return constA * constB * input;而不是return x;来提高它的性能。跨度> -
@AlexFilipovici - 这是一个相当大胆的断言,因为我们不知道
...做了什么(包括对x的任何访问),而且我们不知道 JIT 会做什么如果这些 是GetX函数的唯一部分,则必须这样做。断言消除局部变量会(没有任何限制)提高性能是没有根据的。
标签: c# performance constants compiler-optimization