Здесь происходит несколько интересных вещей.Как уже отмечали другие, когда вы комментируете одно из возвращаемых значений, метод RaySphereFast
теперь становится достаточно маленьким, чтобы встроить его, и действительно Jit решает встроить его.А это, в свою очередь, включает все вспомогательные методы, которые он вызывает.В результате тело цикла заканчивается без вызовов.
Как только это происходит, jit затем "struct поддерживает" различные экземпляры Vec3
, и, поскольку вы инициализировали все поля с константами, jit распространяет теконстанты и складывают их при различных операциях.Из-за этого jit понимает, что результат вызова всегда будет true
.
Поскольку каждая итерация цикла возвращает одно и то же значение, jit понимает, что ни одно из этих вычислений в цикле на самом деле не нужно (так как результат известен) и удаляет их все.Таким образом, в «быстрой» версии вы синхронизируете пустой цикл:
G_M52940_IG04:
BF01000000 mov edi, 1
FFC1 inc ecx
81F980969800 cmp ecx, 0x989680
7CF1 jl SHORT G_M52940_IG04
, тогда как в «медленной» версии вызов не становится встроенным, и ни одна из этих оптимизаций не запускается:
G_M32193_IG04:
488D4C2478 lea rcx, bword ptr [rsp+78H]
C4617B1109 vmovsd qword ptr [rcx], xmm9
C4617B115108 vmovsd qword ptr [rcx+8], xmm10
C4617B115910 vmovsd qword ptr [rcx+16], xmm11
488D4C2460 lea rcx, bword ptr [rsp+60H]
C4617B1121 vmovsd qword ptr [rcx], xmm12
C4617B116908 vmovsd qword ptr [rcx+8], xmm13
C4617B117110 vmovsd qword ptr [rcx+16], xmm14
488D4C2448 lea rcx, bword ptr [rsp+48H]
C4E17B1131 vmovsd qword ptr [rcx], xmm6
C4E17B117908 vmovsd qword ptr [rcx+8], xmm7
C4617B114110 vmovsd qword ptr [rcx+16], xmm8
488D4C2478 lea rcx, bword ptr [rsp+78H]
488D542460 lea rdx, bword ptr [rsp+60H]
4C8D442448 lea r8, bword ptr [rsp+48H]
C4E17B101D67010000 vmovsd xmm3, qword ptr [reloc @RWD64]
E8D2F8FFFF call X:RaySphereFast(struct,struct,struct,double):bool
8BD8 mov ebx, eax
FFC7 inc edi
81FF80969800 cmp edi, 0x989680
7C95 jl SHORT G_M32193_IG04
Если вы действительно заинтересованы в тестировании скорости RaySphereFast
, убедитесь, что вызываете ее с разными или непостоянными аргументами на каждой итерации, а также убедитесь, что используете результат каждой итерации.