std::accumulate
basit bir for
döngüsünden daha hızlı olduğunda, algoritmaları test ediyordum ve bu tuhaf davranışla karşılaşıyordum.Neden döngü için basit bir hızdan daha hızlı birikir?
Oluşturulan assembler'a bakıyorum çok fazla zeki değilim :-) for
döngüsünün MMX yönergelerine göre en iyi duruma getirildiği göründüğünde, birikir bir döngüde genişler.
Bu koddur. davranış -O3
optimizasyon seviyesine, gcc ile tezahür
#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;
}
Buna cevap vermeyi çok isterim. VS2010'un "" özelliği yok çünkü ... :( –
Mysticial
Bu yüzden herkes kendi kendine yuvarlanan standart algoritmaları kullanmayı tercih ediyor. –
"Döngü" ile "döngü" demek istiyor musunuz? işlemci döngüsü olarak, ancak "döngü" yi "döngü" ile değiştirirsem, soru çok daha anlamlı olur. – Mysticial