Для чего стоит использовать инструкцию SSE mulsd
с NaN
почти так же быстро, как и с константой 4.0
(выбранной при броске кубиков, гарантированно случайным).
Этот код:
for (unsigned i = 0; i < 2000000000; i++)
{
double j = doubleValue * i;
}
генерирует этот машинный код (внутри цикла) с помощью clang (я полагаю, что виртуальная машина .NET использует инструкции SSE, когда это возможно):
movsd -16(%rbp), %xmm0 ; gets the constant (NaN or 4.0) into xmm0
movl -20(%rbp), %eax ; puts i into a register
cvtsi2sdq %rax, %xmm1 ; converts i to a double and puts it in xmm1
mulsd %xmm0, %xmm1 ; multiplies xmm0 (the constant) with xmm1 (i)
movsd %xmm1, -32(%rbp) ; puts the result somewhere on the stack
И с двумя миллиардами итераций версия NaN
(как определено макросом C NAN
из <math.h>
) заняла примерно 0,017 меньше секунд для выполнения на моем i7. Разница, вероятно, была вызвана планировщиком задач.
Честно говоря, они такие же быстрые.