TextMate не для "опытных программистов". Это не имеет смысла, TextMate содержит все, что "опытный программист" хотел бы. Это позволяет им определять пакет, который позволяет им быстро настраивать способ, которым они хотят свой исходный код, отформатированный, или тот, который следует инструкциям проекта, быстрый легкий доступ для создания всех структур и классов на основе ввода части конструкции и удара вкладки.
TextMate является моим предпочтительным инструментом, это быстро, легко и все же содержит все функции, с которыми я хотел бы в инструменте к программе. В то время как это не тесно интегрируется в XCode, который не является проблемой для меня, поскольку я не пишу программное обеспечение для Mac OS X. Я пишу программное обеспечение для FreeBSD.
Сгенерированный 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
Как вы можно увидеть, что компилятор заменяет все использования переменных значением константы, что приводит к уменьшению стека.
. Я провел быструю проверку производительности кода, используя компилятор сниппета . Я использовал следующий код:
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
, похоже, считается допустимой микрооптимизацией ].
Ваш код (с использованием 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++)
{
}
}
Это далеко не ответ, просто подумал, что было бы неплохо поделиться этим однако в статье явно не упоминаются преимущества времени выполнения:
Стандартное правило кодирования № 2: Используйте const везде, где это возможно
Выдержка:
Обоснование: Плюс максимального использования const - это принудительная защита компилятора от непреднамеренной записи к данным, которые должны быть доступны только для чтения.
Одно отличие состоит в том, что если у вас есть сборка, которая ссылается на поле const
в другой сборке, и вы позже изменили это значение, ссылающаяся сборка все равно будет использовать старое значение, пока он был восстановлен.