Я запускаю очень простую программу
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
:
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 мы получаем тот же asm для метода 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
такой глупый в данном случае?..
DevDiv Bugs 81184
). Вот почему я был удивлен таким поведением - person Alex Zhukovskiy   schedule 08.04.2015Get4
как 4 (не показано в коде, который я разместил ранее, потому что способ, которым я получил этот код, исключает встраивание функции). Так что это намного лучше, чем x86 JIT (как обычно) - person harold   schedule 08.04.2015i < 4
, когда я устанавливаю точку останова при возврате (см. снимок экрана take.ms/HrF9a) . Я также обнаружил, что компиляция x64 намного медленнее: ~15 секунд против 1 секунды для x86. - person Alex Zhukovskiy   schedule 08.04.2015First breakpoint is not working, but it's expected
, небольшая опечатка - person Alex Zhukovskiy   schedule 08.04.2015