C#编译器是否计算常量的数学?

时间:2013-02-07 13:42:57

标签: c# performance constants compiler-optimization

给出以下代码:

const int constA = 10;
const int constB = 10;

function GetX(int input) {
    int x = constA * constB * input;
    ...
    return x;
}

.Net编译器会'替换'表达式并输入1000,这样计算就不会一遍又一遍地重复吗?

代码运行速度最快的是:

  1. int x = constA * constB * input;
    
  2. int x = 10 * 10 * input;
    
  3. int x = 100 * input;
    
  4. 我猜选项3会比2更快但有时候不是最易读的选项。编译器是否识别这样的模式并相应地对其进行优化?

2 个答案:

答案 0 :(得分:15)

C# Constant Expressions

  

每当表达式是上面列出的类型之一并且仅包含上面列出的结构时,表达式在编译时计算。即使表达式是包含非常量构造的较大表达式的子表达式,也是如此。

(还有更多要阅读的内容,如果你愿意的话)上面提到的“上面”是一个项目符号列表,包括:

  
      
  • 引用类和结构类型的const成员。
  •   

  
      
  • 预定义的+, - ,*,/,%,<<,>>,&,|,^,&&,||,==,!=,<,> ;,< =和> =二元运算符,前提是每个操作数都是上面列出的类型。
  •   

因此,要直接回答您的问题,是的,编译器将在编译时执行计算。

答案 1 :(得分:8)

我在LINQPad中试过这个:

const int constA = 2;
const int constB = 50;

void Main()
{

    Console.WriteLine(GetX(12));
}

int GetX(int input) 
{
    int x = constA * constB * input;

    return x;
}

IL是:

enter image description here

十六进制64值(十进制100)是常量相乘的结果。 mul操作乘以input

所以听起来应用于常量的操作是由编译器优化的。