#include <iostream>
using namespace std;
const int BUFFER_SIZE = 50000000;
double* list = new double[BUFFER_SIZE];
double tightLoop() {
// VERSION 1
// double sum = 0.0;
// for (int i = 0; i < BUFFER_SIZE; ++i) {
// sum += list[i];
// }
// return sum;
// VERSION 2. 7x faster!
double sum = 0.0;
for (int i = 0; i < BUFFER_SIZE; i+=4) {
sum += list[i];
sum += list[i + 1];
sum += list[i + 2];
sum += list[i + 3];
}
return sum;
// VERSION 3. No more gain than simple loop unrolling
// double sum1 = 0.0, sum2 = 0.0, sum3 = 0.0, sum4 = 0.0;
// for (int i = 0; i < BUFFER_SIZE; i += 4) {
// sum1 += list[i];
// sum2 += list[i + 1];
// sum3 += list[i + 2];
// sum4 += list[i + 3];
// }
// return (sum1 + sum2) + (sum3 + sum4);
}
int main() {
double force = 0.0;
force += tightLoop();
force += tightLoop();
force += tightLoop();
force += tightLoop();
force += tightLoop();
force += tightLoop();
force += tightLoop();
cout << force;
delete[] list;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IEJVRkZFUl9TSVpFID0gNTAwMDAwMDA7CmRvdWJsZSogbGlzdCA9IG5ldyBkb3VibGVbQlVGRkVSX1NJWkVdOwoKZG91YmxlIHRpZ2h0TG9vcCgpIHsKCQoJLy8gVkVSU0lPTiAxCgkvLyBkb3VibGUgc3VtID0gMC4wOwoJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBCVUZGRVJfU0laRTsgKytpKSB7CgkvLyAJc3VtICs9IGxpc3RbaV07CgkvLyB9CgkvLyByZXR1cm4gc3VtOwoKICAgIC8vIFZFUlNJT04gMi4gN3ggZmFzdGVyIQkKCWRvdWJsZSBzdW0gPSAwLjA7Cglmb3IgKGludCBpID0gMDsgaSA8IEJVRkZFUl9TSVpFOyBpKz00KSB7CgkJc3VtICs9IGxpc3RbaV07CgkJc3VtICs9IGxpc3RbaSArIDFdOwoJCXN1bSArPSBsaXN0W2kgKyAyXTsKCQlzdW0gKz0gbGlzdFtpICsgM107Cgl9CglyZXR1cm4gc3VtOwoJCgkvLyBWRVJTSU9OIDMuIE5vIG1vcmUgZ2FpbiB0aGFuIHNpbXBsZSBsb29wIHVucm9sbGluZwoJLy8gZG91YmxlIHN1bTEgPSAwLjAsIHN1bTIgPSAwLjAsIHN1bTMgPSAwLjAsIHN1bTQgPSAwLjA7CgkvLyBmb3IgKGludCBpID0gMDsgaSA8IEJVRkZFUl9TSVpFOyBpICs9IDQpIHsKCS8vIAlzdW0xICs9IGxpc3RbaV07CgkvLyAJc3VtMiArPSBsaXN0W2kgKyAxXTsKCS8vIAlzdW0zICs9IGxpc3RbaSArIDJdOwoJLy8gCXN1bTQgKz0gbGlzdFtpICsgM107CgkvLyB9CgkvLyByZXR1cm4gKHN1bTEgKyBzdW0yKSArIChzdW0zICsgc3VtNCk7Cn0KCmludCBtYWluKCkgewoJCglkb3VibGUgZm9yY2UgPSAwLjA7Cglmb3JjZSArPSB0aWdodExvb3AoKTsKCWZvcmNlICs9IHRpZ2h0TG9vcCgpOwoJZm9yY2UgKz0gdGlnaHRMb29wKCk7Cglmb3JjZSArPSB0aWdodExvb3AoKTsKCWZvcmNlICs9IHRpZ2h0TG9vcCgpOwoJZm9yY2UgKz0gdGlnaHRMb29wKCk7Cglmb3JjZSArPSB0aWdodExvb3AoKTsKCWNvdXQgPDwgZm9yY2U7CglkZWxldGVbXSBsaXN0OwoJcmV0dXJuIDA7Cn0=