В качестве примера, обычно лучше всего использовать точные типы для элементов массива, поскольку ожидается, что они будут использовать меньше байтов и, следовательно, появится больше возможностей для улучшения кэширования. Другой пример: когда элементы считываются из этого массива, их можно преобразовать в быстрый тип для выполнения арифметических действий.
Код: Выделить всё
void foo() {
std::array arr {};
// ...
std::int_fast16_t e = arr[index];
}
Изменить: я добавил тесты для std::set и std::unordered_set, каждый с std::uint16_t и std::uint_fast16_t. Что делает тест:
- Создает вектор из N случайных чисел (один раз).
- В цикле N раз: очищает тестируемый контейнер, а затем помещает определенное случайное число из вектора M раз.
Код: Выделить всё
-------------------------------------------------------
std::set | std::uint16_t | std::uint_fast16_t
-------------------+---------------+-------------------
Emplace 10 | 359.072 nsec | 344.232 nsec
Emplace 100 | 3.455 usec | 3.298 usec
Emplace 1000 | 34.285 usec | 32.525 usec
Emplace 10000 | 341.679 usec | 334.176 usec
Emplace 100000 | 3.432 msec | 3.229 msec
-------------------------------------------------------
std::unordered_set | std::uint16_t | std::uint_fast16_t
-------------------+---------------+-------------------
Emplace 10 | 405.566 nsec | 418.305 nsec
Emplace 100 | 3.873 usec | 3.888 usec
Emplace 1000 | 38.617 usec | 38.708 usec
Emplace 10000 | 386.67 usec | 387.169 usec
Emplace 100000 | 3.888 msec | 3.894 msec
Код: Выделить всё
-------------------------------------------------------
std::set | std::uint16_t | std::uint_fast16_t
-------------------+---------------+-------------------
Emplace 10 | 490.606 nsec | 524.057 nsec
Emplace 100 | 5.696 usec | 5.631 usec
Emplace 1000 | 97.678 usec | 95.026 usec
Emplace 10000 | 1.616 msec | 1.617 msec
Emplace 100000 | 8.353 msec | 8.494 msec
-------------------------------------------------------
std::unordered_set | std::uint16_t | std::uint_fast16_t
-------------------+---------------+-------------------
Emplace 10 | 543.433 nsec | 536.635 nsec
Emplace 100 | 5.799 usec | 5.737 usec
Emplace 1000 | 57.326 usec | 57.391 usec
Emplace 10000 | 630.508 usec | 629.023 usec
Emplace 100000 | 4.663 msec | 4.692 msec
- Выполняет работу без измерения для «разогрева»
- Измеряет с монотонным временем
- Объединяет тесты с asm voluty("" : "+m"(container)); чтобы попытаться избежать переупорядочение
- Выполняет чтение данных после тестов, чтобы избежать оптимизации работы
Подробнее здесь: https://stackoverflow.com/questions/798 ... t-fast16-t
Мобильная версия