Почему uint_least16_t быстрее, чем uint_fast16_t для умножения в x86_64?

Стандарт C не совсем ясен в отношении семейства типов 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;
}

Выполняя команду time в программе, я получаю

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-байтовый тип?

11
задан phuclv 28 February 2019 в 11:52
поделиться