我正在測試算法,並遇到這種奇怪的行爲,當std::accumulate
比簡單的for
週期更快。爲什麼積累比一個簡單的循環更快?
看着生成的彙編程序我並不太聰明:-)看起來for
循環是針對MMX指令進行優化的,而累加則擴展成循環。
這是代碼。該行爲與-O3
優化級別,GCC 4.7.1表現
#include <vector>
#include <chrono>
#include <iostream>
#include <random>
#include <algorithm>
using namespace std;
int main()
{
const size_t vsize = 100*1000*1000;
vector<int> x;
x.reserve(vsize);
mt19937 rng;
rng.seed(chrono::system_clock::to_time_t(chrono::system_clock::now()));
uniform_int_distribution<uint32_t> dist(0,10);
for (size_t i = 0; i < vsize; i++)
{
x.push_back(dist(rng));
}
long long tmp = 0;
for (size_t i = 0; i < vsize; i++)
{
tmp += x[i];
}
cout << "dry run " << tmp << endl;
auto start = chrono::high_resolution_clock::now();
long long suma = accumulate(x.begin(),x.end(),0);
auto end = chrono::high_resolution_clock::now();
cout << "Accumulate runtime " << chrono::duration_cast<chrono::nanoseconds>(end-start).count() << " - " << suma << endl;
start = chrono::high_resolution_clock::now();
suma = 0;
for (size_t i = 0; i < vsize; i++)
{
suma += x[i];
}
end = chrono::high_resolution_clock::now();
cout << "Manual sum runtime " << chrono::duration_cast<chrono::nanoseconds>(end-start).count() << " - " << suma << endl;
return 0;
}
盡我所能去嘗試回答這個問題。我不能因爲VS2010沒有''...... :( –
Mysticial
這就是爲什麼大家都說喜歡滾動自己的標準算法。 –
「循環」,你的意思是「循環」嗎?我正在閱讀作爲處理器循環,但如果我用「循環」替換「循環」,這個問題就更有意義了。 – Mysticial