我正在查看新的计时库(C ++ 11)并尝试使用它。我写了以下两个程序:
vector.cpp
#include <iostream>
#include <vector>
#include <chrono>
int main()
{
std::vector<double> vector(1000000, 0.);
auto start = std::chrono::high_resolution_clock::now();
for(int i(0); i < vector.size(); i++)
{
vector[i] += 1.;
}
auto end = std::chrono::high_resolution_clock::now();
std::cout << "Elapsed time: " << std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count() << " milliseconds" << std::endl;
return 0;
}
array.cpp
#include <iostream>
#include <array>
#include <algorithm>
#include <chrono>
int main()
{
std::array<double, 1000000> array;
std::fill(array.begin(), array.end(), 0.);
auto start = std::chrono::high_resolution_clock::now();
for(int i(0); i < array.size(); i++)
{
array[i] += 1.;
}
auto end = std::chrono::high_resolution_clock::now();
std::cout << "Elapsed time: " << std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count() << " milliseconds" << std::endl;
return 0;
}
我为阵列程序获得了9毫秒,为矢量程序获得了12毫秒。 std :: vector似乎比std :: array慢约33%。我做得对吗?为什么会出现这种差异?
Ps:我正在使用GCC 4.7,Mac OS X 10.7。
g++-mp-4.7 -std=c++11 vector.cpp -o vector
g++-mp-4.7 -std=c++11 array.cpp -o array
答案 0 :(得分:8)
我将您的代码更改为:
std::array<double, 1000000> array;
double total = 0;
std::fill(array.begin(), array.end(), 0.);
for (unsigned j = 0; j < 1000; ++j)
{
auto start = std::chrono::high_resolution_clock::now();
for (unsigned i = 0; i < array.size(); i++)
{
array[i] += 1.;
}
auto end = std::chrono::high_resolution_clock::now();
total = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
}
std::cout << total << " for Array." << std::endl;
std::vector<double> vector(1000000, 0.);
total = 0;
for (unsigned j = 0; j < 1000; ++j)
{
auto start = std::chrono::high_resolution_clock::now();
for (unsigned i = 0; i < vector.size(); i++)
{
vector[i] += 1.;
}
auto end = std::chrono::high_resolution_clock::now();
total = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
}
std::cout << total << " for Vector." << std::endl;
我的结果使用-O3
:
8123 for Array.
8117 for Vector.
对我来说,两者都同样快。
答案 1 :(得分:2)
如果没有启用优化,这些数字就毫无意义。很可能重复调用size()会对你的情况产生影响。
答案 2 :(得分:0)
std::array
在编译时已知大小,因此内存最有可能在堆栈上分配。
std::vector
使用std::allocator
(可能在运行时使用`new来从免费存储(也称为堆)中分配内存)。
我想说30%对堆和堆栈分配是正常的。
编辑:在liveworkspace.org(std::vector
和std::array
)上运行了几次(不是最科学的测量),我得到8 vs 10毫秒由于所有分配确实都在测量范围之外,我天真地得出结论,访问堆比访问堆栈内存要慢。如果这通常是正确的,我不会感到惊讶,因为在堆的情况下存在额外的间接性。