【发布时间】:2020-01-23 17:16:21
【问题描述】:
我做了一个测试,通过将它们的值打印到 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++ 中打印数组元素中的值平均比打印单个对象中的值慢?
*信息:我不知道数组元素的打印通常是否平均较慢,与特定语言无关。
【问题讨论】:
-
我很困惑为什么 Mingw 这么慢。
-
从根本上说,访问对象是直接的。访问数组的元素需要计算元素的偏移量、位置或地址(从数组的开头开始)。许多现代处理器可以在一条指令中做到这一点。
-
优化构建还是调试构建?这很重要。
-
@drescherjm 这是因为Windows系统与Linux相比。
-
可能是打印到标准输出所需的时间在 windows 中比在 linux 中更糟
标签: c++ arrays performance benchmarking microbenchmark