Я бегу очень простая программаПочему x86 JIT умнее, чем x64?
static void Main(string[] args)
{
Console.WriteLine(Get4S());
Console.WriteLine(Get4());
}
private static int Get4S()
{
return 4;
}
private static int Get4()
{
int res = 0;
for (int i = 0; i < 4; i++)
{
res++;
}
return res;
}
, когда он работает под x86
он встраивает Get4S
метод и Get4
ASM код:
00000000 push ebp
00000001 mov ebp,esp
00000003 xor eax,eax
00000005 inc eax
00000006 inc eax
00000007 inc eax
00000008 inc eax
00000009 pop ebp
0000000a ret
НО при запуске под x64 мы получаем тот же ассемблер для Get4S
метод, но Get4
asm не оптимизирован:
00000000 xor eax,eax
00000002 xor edx,edx
00000004 inc eax
00000006 inc edx
00000008 cmp edx,4
0000000b jl 0000000000000004
0000000d ret
Я предположил, что x64
JIT разворачивает цикл, а затем видит, что результат может быть вычислен во время компиляции, а функция с результатом компиляции будет включена. Но ничего из этого не случилось.
Почему x64
так глупо в этом случае? ..
Включены ли jim opimizations? – CodesInChaos
@CodesInChaos, конечно, вы видите, что x86-код оптимизирован. Это не оптимально, но он разворачивает цикл, это невозможно, когда оптимизация jit подавлена. –
Не удалось воспроизвести. x64 JIT также оптимизирован для постоянной 4 для меня. Код выглядел так: http://pastebin.com/UEtXUsLA – harold