Код: Выделить всё
public static void SingleLineTest()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
int count = 0;
for (uint i = 0; i < 1000000000; ++i) {
count += i % 16 == 0 ? 1 : 0;
}
stopwatch.Stop();
Console.WriteLine("Single-line test --> Count: {0}, Time: {1}", count, stopwatch.ElapsedMilliseconds);
}
public static void MultiLineTest()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
int count = 0;
for (uint i = 0; i < 1000000000; ++i) {
var isMultipleOf16 = i % 16 == 0;
count += isMultipleOf16 ? 1 : 0;
}
stopwatch.Stop();
Console.WriteLine("Multi-line test --> Count: {0}, Time: {1}", count, stopwatch.ElapsedMilliseconds);
}
Возможно, еще более странно то, что на x86 (но не на x64) порядок вызова методов имеет около 20% влияние на производительность. Вызовите такие методы...
Код: Выделить всё
static void Main()
{
SingleLineTest();
MultiLineTest();
}
Код: Выделить всё
static void Main()
{
MultiLineTest();
SingleLineTest();
}
Наконец, чтобы продемонстрировать, что порядок JIT важен, сначала оставьте MultiLineTest, но заставьте сначала JIT-обрабатывать SingleLineTest...
Код: Выделить всё
static void Main()
{
RuntimeHelpers.PrepareMethod(typeof(Program).GetMethod("SingleLineTest").MethodHandle);
MultiLineTest();
SingleLineTest();
}
Если вы отключите «Подавить оптимизацию JIT при загрузка модуля» в VS2010, вы можете поставить точку останова в SingleLineTest и увидеть, что ассемблерный код в цикле один и тот же независимо от порядка JIT; однако ассемблерный код в начале метода различается. Но какое это имеет значение, когда большая часть времени проводится в цикле, вызывает недоумение.
Пример проекта, демонстрирующего такое поведение, находится на github.
Неясно, как такое поведение влияет на реальные приложения. Одна из проблем заключается в том, что это может привести к нестабильности настройки производительности в зависимости от порядка первого вызова методов. Проблемы такого рода было бы трудно обнаружить с помощью профилировщика. После того, как вы обнаружите «горячие точки» и оптимизируете их алгоритмы, будет трудно определить это без долгих догадок и предварительной проверки, возможно ли дополнительное ускорение с помощью методов JITing.
Обновление. См. также запись Microsoft Connect по этой проблеме.
Подробнее здесь: https://stackoverflow.com/questions/104 ... erformance