为什么数组元素的平均打印速度比C ++中单个对象的打印速度慢?

问题描述 投票:-1回答:2

我进行了一项测试,以通过将其值打印到CLI中来查看访问数组元素和单个对象之间的区别:

#include <iostream>
#include <chrono>
#include <iomanip>

int main()
{
    int a[10] = {1,2,3,4,5,6,7,8,9,10};

    int v1 = 1;
    int v2 = 2;
    int v3 = 3;
    int v4 = 4;
    int v5 = 5;
    int v6 = 6;
    int v7 = 7;
    int v8 = 8;
    int v9 = 9;
    int v10 = 10;

    std::cout << "Array output:" << std::endl << std::endl;

    auto t_start1 = std::chrono::high_resolution_clock::now();

    std::cout << "1. value: " << a[0] << std::endl;
    std::cout << "2. value: " << a[1] << std::endl;
    std::cout << "3. value: " << a[2] << std::endl;
    std::cout << "4. value: " << a[3] << std::endl;
    std::cout << "5. value: " << a[4] << std::endl;
    std::cout << "6. value: " << a[5] << std::endl;
    std::cout << "7. value: " << a[6] << std::endl;
    std::cout << "8. value: " << a[7] << std::endl;
    std::cout << "9. value: " << a[8] << std::endl;
    std::cout << "10. value: " << a[9] << std::endl;

    auto t_end1 = std::chrono::high_resolution_clock::now();

    std::cout << std::endl;

    std::cout << "Variable output:" << std::endl << std::endl;

    auto t_start2 = std::chrono::high_resolution_clock::now();

    std::cout << "1. value: " << v1 << std::endl;
    std::cout << "2. value: " << v2 << std::endl;
    std::cout << "3. value: " << v3 << std::endl;
    std::cout << "4. value: " << v4 << std::endl;
    std::cout << "5. value: " << v5 << std::endl;
    std::cout << "6. value: " << v6 << std::endl;
    std::cout << "7. value: " << v7 << std::endl;
    std::cout << "8. value: " << v8 << std::endl;
    std::cout << "9. value: " << v9 << std::endl;
    std::cout << "10. value: " << v10 << std::endl;


    auto t_end2 = std::chrono::high_resolution_clock::now();

    std::cout<< std::endl << "Time passed with array: "
              << std::chrono::duration<double, std::milli>(t_end1-t_start1).count()
              << " ms\n" << std::endl;
    std::cout<< std::endl << "Time passed with variables: "
              << std::chrono::duration<double, std::milli>(t_end2-t_start2).count()
              << " ms\n" << std::endl;

    return 0;
}

在第一个实现上(在Windows 10下为MingW / g ++,cmd.exe),数组元素内部值的打印平均比使用单个标量对象慢3 毫秒

适用于Windows的表格,g ++ / MingW:

                Array Elements:            Single Objects:   

1. Run          13.9609 ms                 9.529 ms
2. Run          11.9031 ms                 8.0936 ms
3. Run          13.3706 ms                 9.5264 ms
4. Run          12.5302 ms                 8.4723 ms
5. Run          14.4679 ms                 9.9688 ms
6. Run          12.3989 ms                 8.4326 ms
7. Run          12.8719 ms                 10.1851 ms
8. Run          10.9138 ms                 7.4481 ms
9. Run          12.8971 ms                 9.4094 ms
10. Run         11.9045 ms                 7.9391 ms
11. Run          9.9192 ms                 8.4047 ms
12. Run         13.4106 ms                 10.0296 ms

在Linux Ubuntu下的第二种实现g ++中,数组元素内部值的打印平均比使用单个标量对象慢3 微秒

。]

Linux Ubuntu表格,g ++:

                Array Elements:            Single Objects:   

1. Run          0.013 ms                   0.008 ms
2. Run          0.012 ms                   0.007 ms
3. Run          0.013 ms                   0.008 ms
4. Run          0.014 ms                   0.009 ms
5. Run          0.012 ms                   0.008 ms
6. Run          0.013 ms                   0.008 ms
7. Run          0.013 ms                   0.009 ms
8. Run          0.014 ms                   0.009 ms
9. Run          0.012 ms                   0.008 ms
10. Run         0.013 ms                   0.009 ms
11. Run         0.012 ms                   0.009 ms
12. Run         0.012 ms                   0.008 ms 

我的问题:

  • 为什么打印数组元素中的值的平均速度比* C ++中单个对象的打印速度慢?

    *信息:我不知道与特定语言无关,对数组元素的访问是否平均较慢。

我进行了一项测试,以查看将数组元素和单个对象的值打印到CLI中的方法:#include #include #include

c++ arrays performance scalar microbenchmark
2个回答
2
投票
您测量格式化和输出数组元素以及刷新每个元素上的输出流(使用std::endl)所花费的时间,这涉及系统调用。

从数组中加载元素比这要短得多。从i1-i9900KS上的内存中,从L1缓存中加载CPU寄存器需要4个CPU周期(在5GHz CPU上不到1纳秒)-215个CPU周期。


0
投票
在测试中,将内容写入cout比访问内存中的内容要花费更多的时间。

使情况更糟的是,它甚至可能不从数组或变量中读取值,因为该值已在编译时知道。在两种情况下都可能只使用常量。

© www.soinside.com 2019 - 2024. All rights reserved.