У меня есть следующая проблема:
Время записи до std::array
для int8
, int16
, int32
и int64
удваивается при каждом увеличении размера. Я понимаю такое поведение для 8-битного процессора, но не 32/64-битного.
Почему для 32-разрядной системы требуется в 4 раза больше времени для сохранения 32-битных значений, чем для сохранения 8-битных значений?
Вот мой тестовый код:
#include <iostream>
#include <array>
#include <chrono>
std::array<std::int8_t, 64 * 1024 * 1024> int8Array;
std::array<std::int16_t, 64 * 1024 * 1024> int16Array;
std::array<std::int32_t, 64 * 1024 * 1024> int32Array;
std::array<std::int64_t, 64 * 1024 * 1024> int64Array;
void PutZero()
{
auto point1 = std::chrono::high_resolution_clock::now();
for (auto &v : int8Array) v = 0;
auto point2 = std::chrono::high_resolution_clock::now();
for (auto &v : int16Array) v = 0;
auto point3 = std::chrono::high_resolution_clock::now();
for (auto &v : int32Array) v = 0;
auto point4 = std::chrono::high_resolution_clock::now();
for (auto &v : int64Array) v = 0;
auto point5 = std::chrono::high_resolution_clock::now();
std::cout << "Time of processing int8 array:\t" << (std::chrono::duration_cast<std::chrono::microseconds>(point2 - point1)).count() << "us." << std::endl;
std::cout << "Time of processing int16 array:\t" << (std::chrono::duration_cast<std::chrono::microseconds>(point3 - point2)).count() << "us." << std::endl;
std::cout << "Time of processing int32 array:\t" << (std::chrono::duration_cast<std::chrono::microseconds>(point4 - point3)).count() << "us." << std::endl;
std::cout << "Time of processing int64 array:\t" << (std::chrono::duration_cast<std::chrono::microseconds>(point5 - point4)).count() << "us." << std::endl;
}
int main()
{
PutZero();
std::cout << std::endl << "Press enter to exit" << std::endl;
std::cin.get();
return 0;
}
Я скомпилирую его под linux с помощью: g++ -o array_issue_1 main.cpp -O3 -std=c++14
и мои результаты следующие:
Time of processing int8 array: 9922us.
Time of processing int16 array: 37717us.
Time of processing int32 array: 76064us.
Time of processing int64 array: 146803us.
Если я скомпилирован с -O2
, то результаты в 5 раз хуже для int8
!
Вы также можете скомпилировать этот источник в Windows. Вы получите аналогичную связь между результатами.
Обновление # 1
Когда я компилирую с -O2, мои результаты следующие:
Time of processing int8 array: 60182us.
Time of processing int16 array: 77807us.
Time of processing int32 array: 114204us.
Time of processing int64 array: 186664us.
Я не анализировал выход ассемблера. Главное, что я хотел бы написать эффективный код на С++ и что-то подобное, что такие вещи, как std::array
, могут быть сложными с точки зрения производительности и как-то контр-интуитивно понятными.