#include <iostream>
#include <random>
#include <chrono>
#include <algorithm>
using namespace std;
using namespace std::chrono;
const int sz = 500000;
const int rpt = 2000;
int n;
double sum=0;
void f1(double *arr) {
for (int i = 0; i < n; i++)
sum += arr[i];
}
void f2(double *arr) {
for (int i = 0; i < n; i++)
if (arr[i])
sum += arr[i];
}
int main() {
mt19937_64 engine(time(0));
uniform_real_distribution<> distri(-1000000.0, +1000000.0);
uniform_int_distribution<int> distn(0,sz-1);
volatile double d;
n = sz;
double *arr = new double[n];
for (int i=0; i<sz/2; i++) { // play with density here
int k = distn(engine);
arr[k]=distri(engine);
}
int zero = count(arr, arr+n, 0.0);
cout << zero << " null items, " << (double)zero/sz*100.0 << "%"<<endl;
high_resolution_clock::time_point t1=high_resolution_clock::now();
for (int j=0; j<rpt; j++) {
sum=0;
f1(arr);
d=sum;
}
high_resolution_clock::time_point t2=high_resolution_clock::now();
cout << duration_cast<milliseconds>(t2-t1).count() <<endl;
cout<<"\t"<<sum<<endl;
high_resolution_clock::time_point t3=high_resolution_clock::now();
for (int j=0; j<rpt; j++) {
sum=0;
f2(arr);
d=sum;
}
high_resolution_clock::time_point t4=high_resolution_clock::now();
cout << duration_cast<milliseconds>(t4-t3).count() <<endl;
cout<<"\t"<<sum<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm87IAoKY29uc3QgaW50IHN6ID0gNTAwMDAwOyAKY29uc3QgaW50IHJwdCA9IDIwMDA7CmludCBuOyAKZG91YmxlIHN1bT0wOwoKdm9pZCBmMShkb3VibGUgKmFycikgewogIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgc3VtICs9IGFycltpXTsKfQoKdm9pZCBmMihkb3VibGUgKmFycikgewogIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgaWYgKGFycltpXSkKICAgICAgICBzdW0gKz0gYXJyW2ldOwp9CgppbnQgbWFpbigpIHsKCW10MTk5MzdfNjQgZW5naW5lKHRpbWUoMCkpOwoJdW5pZm9ybV9yZWFsX2Rpc3RyaWJ1dGlvbjw+IGRpc3RyaSgtMTAwMDAwMC4wLCArMTAwMDAwMC4wKTsKCXVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+IGRpc3RuKDAsc3otMSk7Cgl2b2xhdGlsZSBkb3VibGUgZDsgCgkKCW4gPSBzejsKCWRvdWJsZSAqYXJyID0gbmV3IGRvdWJsZVtuXTsgCglmb3IgKGludCBpPTA7IGk8c3ovMjsgaSsrKSB7ICAgLy8gcGxheSB3aXRoIGRlbnNpdHkgaGVyZQoJCWludCBrID0gZGlzdG4oZW5naW5lKTsKCQlhcnJba109ZGlzdHJpKGVuZ2luZSk7ICAKCX0KCWludCB6ZXJvID0gY291bnQoYXJyLCBhcnIrbiwgMC4wKTsKCWNvdXQgPDwgemVybyA8PCAiIG51bGwgaXRlbXMsICIgPDwgKGRvdWJsZSl6ZXJvL3N6KjEwMC4wIDw8ICIlIjw8ZW5kbDsgIAoJCgloaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDE9aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsgCglmb3IgKGludCBqPTA7IGo8cnB0OyBqKyspIHsKICAJICBzdW09MDsgCgkgIGYxKGFycik7CgkgIGQ9c3VtOwoJfQoJaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQyPWhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7IAoJY291dCA8PCBkdXJhdGlvbl9jYXN0PG1pbGxpc2Vjb25kcz4odDItdDEpLmNvdW50KCkgPDxlbmRsOyAKCWNvdXQ8PCJcdCI8PHN1bTw8ZW5kbDsgCgoJaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQzPWhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7IAoJZm9yIChpbnQgaj0wOyBqPHJwdDsgaisrKSB7CgkgIHN1bT0wOwogCSAgZjIoYXJyKTsKIAkgIGQ9c3VtOwoJfQoJaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjp0aW1lX3BvaW50IHQ0PWhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7IAoJY291dCA8PCBkdXJhdGlvbl9jYXN0PG1pbGxpc2Vjb25kcz4odDQtdDMpLmNvdW50KCkgPDxlbmRsOyAKCWNvdXQ8PCJcdCI8PHN1bTw8ZW5kbDsgCgkKCXJldHVybiAwOwp9