Есть ли какой-то выигрыш в производительности при использовании модификаторов const или readonly для полей в c #? - PullRequest
6 голосов
/ 03 августа 2011

Есть ли какой-либо выигрыш в производительности при использовании полей const или readonly по сравнению с обычными изменяемыми полями, когда используются только закрытые переменные.

Например:

public class FooBaar
{
     private string foo = "something";
     private const string baar = "something more"

     public void Baaz()
     {
         //access foo, access baar
     }
}

В приведенном выше примере вы видите два поля: foo и baar. Оба недоступны вне класса, поэтому многие люди предпочитают использовать const вместо private. const обеспечивает какой-либо выигрыш в производительности?


Этот вопрос был ранее закрыт сообществом, потому что люди неправильно поняли этот вопрос как «В чем разница между const и readonly с точки зрения производительности?» , на который был дан ответ здесь: В чем разница между const и readonly? .
Но на самом деле я имею в виду, «могу ли я получить какое-либо преимущество в производительности, если использовать const или readonly вместо того, чтобы не использовать ни одного из них» .

Ответы [ 2 ]

15 голосов
/ 03 августа 2011

Констант будет оптимизирован компилятором так, чтобы он был встроен в ваш код, а только для чтения не может быть встроен.Однако вы не можете создавать константы всех типов - поэтому здесь вы должны делать их только для чтения.

Так что, если вам нужно постоянное значение в вашем коде, вы должны сначала использовать const, если это возможно, если нет, то только для чтения, чтобы обеспечить безопасность, но не преимущества для производительности.

Как пример:

public class Example
{
    private const int foo = 5;
    private readonly Dictionary<int, string> bar = new Dictionary<int, string>();

    //.... missing stuff where bar is populated

    public void DoSomething()
    {
       Console.Writeline(bar[foo]);

       // when compiled the above line is replaced with Console.Writeline(bar[5]);
       // because at compile time the compiler can replace foo with 5
       // but it can't do anything inline with bar itself, as it is readonly
       // not a const, so cannot benefit from the optimization
    }
}
5 голосов
/ 03 августа 2011

Я бы не стал сильно беспокоиться о производительности этих конструкций, пока вы не столкнетесь с критическим фрагментом кода, который требует от вас таких измерений.Они предназначены для обеспечения правильности кода, а не для повышения производительности.

...