Существует ли преимущество во время выполнения для использования локальных переменных константы?

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

TextMate является моим предпочтительным инструментом, это быстро, легко и все же содержит все функции, с которыми я хотел бы в инструменте к программе. В то время как это не тесно интегрируется в XCode, который не является проблемой для меня, поскольку я не пишу программное обеспечение для Mac OS X. Я пишу программное обеспечение для FreeBSD.

44
задан Richard Szalay 10 November 2009 в 13:26
поделиться

5 ответов

Сгенерированный IL отличается (с использованием режима Release):

using constant local                   using normal local
---------------------------------------------------------------------
.entrypoint                            .entrypoint
.maxstack 2                            .maxstack 2
.locals init (                         .locals init (
    [0] int32 i)                           [0] int32 timesToLoop,
L_0000: ldc.i4.0                           [1] int32 i)
L_0001: stloc.0                        L_0000: ldc.i4.s 50 
L_0002: br.s L_0008                    L_0002: stloc.0 
L_0004: ldloc.0                        L_0003: ldc.i4.0  
L_0005: ldc.i4.1                       L_0004: stloc.1 
L_0006: add                            L_0005: br.s L_000b 
L_0007: stloc.0                        L_0007: ldloc.1 
L_0008: ldloc.0                        L_0008: ldc.i4.1 
L_0009: ldc.i4.s 50                    L_0009: add
L_000b: blt.s L_0004                   L_000a: stloc.1 
L_000d: ret                            L_000b: ldloc.1 
                                       L_000c: ldloc.0 
                                       L_000d: blt.s L_0007
                                       L_000f: ret 

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

81
ответ дан 26 November 2019 в 21:53
поделиться

. Я провел быструю проверку производительности кода, используя компилятор сниппета . Я использовал следующий код:

    public static void Main()
    {
        DateTime datStart = DateTime.UtcNow;
        const int timesToLoop = 1000000;

        for (int i=0; i < timesToLoop; i++)
        {
            WL("Line Number " + i.ToString());
        }

        DateTime datEnd = DateTime.UtcNow;
        TimeSpan tsTimeTaken = datEnd - datStart;
        WL("Time Taken: " + tsTimeTaken.TotalSeconds);
        RL();
    }

Обратите внимание, WL и RL - это просто вспомогательные методы для чтения и записи в консоль.

Чтобы проверить непостоянную версию, я просто удалил const ключевое слово. Результаты были удивительными:

                        Time Taken (average of 3 runs)

Using const keyword         26.340s
Without const keyword       28.276s

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

13
ответ дан 26 November 2019 в 21:53
поделиться

Ваш код (с использованием const) будет фактически скомпилирован как:

public static int Main(string[] args){    
    for (int i=0; i < 50; i++)  
    {

    }
}

, а переменная будет компилироваться как переменная:

public static int Main(string[] args){
    int timesToLoop = 50;    
    for (int i=0; i < timesToLoop; i++)  
    {

    }
}
6
ответ дан 26 November 2019 в 21:53
поделиться

Это далеко не ответ, просто подумал, что было бы неплохо поделиться этим однако в статье явно не упоминаются преимущества времени выполнения:
Стандартное правило кодирования № 2: Используйте const везде, где это возможно

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

4
ответ дан 26 November 2019 в 21:53
поделиться

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

0
ответ дан 26 November 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: