Следующий метод ничего не делает 5 000 000 раз:
public static void TestTest()
{
for(int i = 0; i != 5000000; ++i);
}
Компиляция приводит к следующему IL:
.method public hidebysig static void TestTest() cil managed
{
.maxstack 2
.locals init (
[0] int32 num)
L_0000: ldc.i4.0
L_0001: stloc.0
L_0002: br.s L_0008
L_0004: ldloc.0
L_0005: ldc.i4.1
L_0006: add
L_0007: stloc.0
L_0008: ldloc.0
L_0009: ldc.i4 0x4c4b40
L_000e: bne.un.s L_0004
L_0010: ret
}
Работая на Pentium, я считаю, что он JITted для:
00000000 push ebp
00000001 mov ebp,esp
00000003 push eax
00000004 cmp dword ptr ds:[002030E4h],0
0000000b je 00000012
0000000d call 6CE7A839
00000012 xor edx,edx
00000014 mov dword ptr [ebp-4],edx
00000017 xor edx,edx
00000019 mov dword ptr [ebp-4],edx
0000001c nop
0000001d jmp 00000022
0000001f inc dword ptr [ebp-4]
00000022 cmp dword ptr [ebp-4],4C4B40h
00000029 jne 0000001F
0000002b nop
0000002c mov esp,ebp
0000002e pop ebp
0000002f ret
В основном это просто тратит свое время, увеличивая значение, сравнивая его с 5000000 и затем возвращая несколько байтов назад, если оно не равно.Скорее всего, все это будет в кеше L1.Возможно, это может быть немного более эффективно, чем это, если сборка с ручным кодированием, хотя, конечно, реальный способ ее оптимизации - игнорировать все это, но за исключением того, что это почти так же хорошо, как вы могли ожидать с любым языком.
В общем, не важен ни размер языка, ни сам цикл.