C++ 将较短的数据类型写入内存不需要';不影响运行时?

C++ 将较短的数据类型写入内存不需要';不影响运行时?,c++,c++11,memory,int,benchmarking,C++,C++11,Memory,Int,Benchmarking,我一直在比较几种数据类型的写入时间,我注意到一些我觉得非常困惑的事情。首先,这是我的代码: #include <iostream> #include <array> #include <ctime> #define its 1000000 #define len 1000 int main() { std::array<int, len> int_arr; std::array<char, len> char_arr

我一直在比较几种数据类型的写入时间,我注意到一些我觉得非常困惑的事情。首先,这是我的代码:

#include <iostream>
#include <array>
#include <ctime>

#define its 1000000
#define len 1000

int main()
{
    std::array<int, len> int_arr;
    std::array<char, len> char_arr;
    std::array<bool, len> bool_arr;
    std::clock_t begin = std::clock();
    for (int i = 0; i < its; ++i)
    {
        std::fill(int_arr.begin(), int_arr.end(), 0);
    }
    std::clock_t end = std::clock();
    double elapsed = double(end - begin) / CLOCKS_PER_SEC;
    std::cout << "int_arr " << elapsed << std::endl;
    begin = std::clock();
    for (int i = 0; i < its; ++i)
    {
        std::fill(char_arr.begin(), char_arr.end(), 0);
    }
    end = std::clock();
    elapsed = double(end - begin) / CLOCKS_PER_SEC;
    std::cout << "char_arr " << elapsed << std::endl;
    begin = std::clock();
    for (int i = 0; i < its; ++i)
    {
        std::fill(bool_arr.begin(), bool_arr.end(), false);
    }
    end = std::clock();
    elapsed = double(end - begin) / CLOCKS_PER_SEC;
    std::cout << "bool_arr " << elapsed << std::endl;
}
而另一半时间,它的速度是4倍(在本例中,系数为3.91):


此外,它永远不会介于两者之间!这到底是怎么回事?如能解释,将不胜感激

“我希望char和bool所花费的时间大致相同,因为计算机仍然需要将完整字节写入RAM。”-您检查生成的程序集了吗?您是否检查了CPU公开的性能计数器?我发现最好在微基准标记时使用谷歌的库,在Linux上使用
perf
。您可能也想使用它们,因为它们会给您提供更多的数据;每个缓存中的每个缓存线有多大;如何/何时将每个缓存刷新到下一个级别并最终刷新到RAM。您的一些数据长度足够小,可以放入我的二级缓存。因此,每个测试最终可能会测量刷新前一个测试的时间,而不是它自己的时间。在分析生成的程序集时,您可能还想花一些时间阅读,这可能有助于解释发生了什么。我使用-O3优化器标志编译了上述代码——好吧,谢谢。大多数情况下,我们都会看到这样的问题,当发现海报在未启用优化的情况下进行测试时,这就浪费了时间和精力。“我希望char和bool所花的时间大致相同,因为计算机仍然需要将完整字节写入RAM。”-您检查生成的程序集了吗?您是否检查了CPU公开的性能计数器?我发现最好在微基准标记时使用谷歌的库,在Linux上使用
perf
。您可能也想使用它们,因为它们会给您提供更多的数据;每个缓存中的每个缓存线有多大;如何/何时将每个缓存刷新到下一个级别并最终刷新到RAM。您的一些数据长度足够小,可以放入我的二级缓存。因此,每个测试最终可能会测量刷新前一个测试的时间,而不是它自己的时间。在分析生成的程序集时,您可能还想花一些时间阅读,这可能有助于解释发生了什么。我使用-O3优化器标志编译了上述代码——好吧,谢谢。大多数情况下,我们都会看到这样的问题,当发现海报在未启用优化的情况下进行测试时,这将是浪费时间和精力。
int_arr 0.043705
char_arr 0.01995
bool_arr 0.022835
int_arr 0.076907
char_arr 0.01965
bool_arr 0.019354