Почему uint_least16_t быстрее, чем uint_fast16_t для умножения в x86_64?
Стандарт С довольно неясен в отношенииuint_fast*_t
семейство типов. В системе gcc-4.4.4 linux x86_64 типыuint_fast16_t
а такжеuint_fast32_t
оба 8 байтов в размере. Тем не менее, умножение 8-байтовых чисел кажется довольно медленным, чем умножение 4-байтовых чисел. Следующий фрагмент кода демонстрирует это:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int
main ()
{
uint_least16_t p, x;
int count;
p = 1;
for (count = 100000; count != 0; --count)
for (x = 1; x != 50000; ++x)
p*= x;
printf("%"PRIuLEAST16, p);
return 0;
}
Запустив команду времени на программу, я получаю
real 0m7.606s
user 0m7.557s
sys 0m0.019s
Если я изменю тип наuint_fast16_t
(и модификатор printf), время становится
real 0m12.609s
user 0m12.593s
sys 0m0.009s
Так что, было бы не намного лучше, если бы заголовок stdint.h был определенuint_fast16_t
(а также uint_fast32_t) быть 4-байтовым типом?