Возьмите два следующих фрагмента:
int main()
{
unsigned long int start = utime();
__int128_t n = 128;
for(__int128_t i=1; i<1000000000; i++)
n = (n * i);
unsigned long int end = utime();
cout<<(unsigned long int) n<<endl;
cout<<end - start<<endl;
}
и
int main()
{
unsigned long int start = utime();
__int128_t n = 128;
for(__int128_t i=1; i<1000000000; i++)
n = (n * i) >> 2;
unsigned long int end = utime();
cout<<(unsigned long int) n<<endl;
cout<<end - start<<endl;
}
Я сравниваю 128-битные целые числа в С++. При выполнении первого (просто умножение) все работает в ок. 0,95 секунды. Когда я также добавляю операцию сдвига бит (второй фрагмент), время выполнения увеличивается до поразительного 2,49 секунды.
Как это возможно? Я думал, что смещение бит было одной из самых легких операций для процессора. Почему из-за такой простой операции возникает так много накладных расходов? Я компилирую с активированным флагом O3.
Любая идея?