Компилятор C # вычисляет математику по константам?

Учитывая следующий код:

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;
     

Я думаю, что вариант 3 будет быстрее, чем 2, но иногда не самый читаемый вариант. Компилятор распознает подобные шаблоны и соответственно оптимизирует их?

8
Данный вопрос был упрощен, чтобы показать проблему очень быстро. Я мог бы, конечно, дать вам полное наследование классов и т. Д. И т. Д. ... но я решил не делать этого.
добавлено автор amaters, источник
Данный вопрос был упрощен, чтобы показать проблему очень быстро. Я мог бы, конечно, дать вам полное наследование классов и т. Д. И т. Д. ... но я решил не делать этого.
добавлено автор amaters, источник
В конце дня вам все равно придется умножать переменный input , который будет узким местом. Так зачем беспокоиться?
добавлено автор BoltClock, источник
Off, если у вас несколько вызовов метода GetX , вы можете улучшить его производительность, избавившись от переменной x и используйте return constA * constB * input ; вместо return x; .
добавлено автор Alex Filipovici, источник
Off, если у вас несколько вызовов метода GetX , вы можете улучшить его производительность, избавившись от переменной x и используйте return constA * constB * input ; вместо return x; .
добавлено автор Alex Filipovici, источник
@AlexFilipovici - это довольно лысое утверждение, учитывая, что мы не знаем, что делает ... (в том числе, любые обращения к x )) и что мы не знаем что JIT обязательно сделает, если те были единственными частями функции GetX . Утверждение, что устранение локальной переменной (без какой-либо квалификации) повышает производительность, необоснованно.
добавлено автор Damien_The_Unbeliever, источник
@AlexFilipovici - это довольно лысое утверждение, учитывая, что мы не знаем, что делает ... (в том числе, любые обращения к x )) и что мы не знаем что JIT обязательно сделает, если те были единственными частями функции GetX . Утверждение, что устранение локальной переменной (без какой-либо квалификации) повышает производительность, необоснованно.
добавлено автор Damien_The_Unbeliever, источник
Вы имеете в виду «100» вместо «1000» :) Не могли бы вы проверить это, например, с помощью ILSpy?
добавлено автор Mr47, источник

3 ответы

C# Constant Expressions:

Всякий раз, когда выражение относится к одному из перечисленных выше типов и содержит только перечисленные выше конструкции, выражение оценивается во время компиляции. Это справедливо, даже если выражение является подвыражением большего выражения, содержащего непостоянные конструкции.

(и многое другое читать, если хотите). «выше» - это маркированный список, в том числе:

      
  • Ссылки на константные элементы классов и типов.
  •   

а также,

  • The predefined +, –, *, /, %, <<, >>, &, |, ^, &&, ||, ==, !=, <, >, <=, and >= binary operators, provided each operand is of a type listed above.

Итак, чтобы напрямую ответить на ваш вопрос, да, компилятор выполнит расчет во время компиляции.

14
добавлено

Я попробовал это в 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;
}

ИЛ:

enter image description here

Значение hex 64 (100 в десятичной форме) является результатом умножения констант. Операция mul - это умножение на input .

Таким образом, похоже, что операции, применяемые к константам, оптимизируются компилятором.

7
добавлено
Ой, опечатка. Исправлена. Благодаря !
добавлено автор Larry, источник
2 * 2 == 100 ??
добавлено автор Dave, источник

Я попробовал это в 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;
}

ИЛ:

enter image description here

Значение hex 64 (100 в десятичной форме) является результатом умножения констант. Операция mul - это умножение на input .

Таким образом, похоже, что операции, применяемые к константам, оптимизируются компилятором.

7
добавлено
Ой, опечатка. Исправлена. Благодаря !
добавлено автор Larry, источник
2 * 2 == 100 ??
добавлено автор Dave, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot