#include <algorithm>
#include <ctime>
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
vector<int> createArrays() {
vector<int> result(rand() % 13);
generate(result.begin(), result.end(), rand);
return result;
}
vector<int> test1(const vector<int>& testValues1, const vector<int>& testValues2) {
vector<int> result(testValues1.size() * testValues2.size());
for_each(begin(result), end(result), [&, it = 0U](auto& i) mutable {
i = testValues1[it / testValues2.size()] + testValues2[it % testValues2.size()];
++it;
});
return result;
}
vector<int> test2(const vector<int>& testValues1, const vector<int>& testValues2) {
vector<int> result(testValues1.size() * testValues2.size());
auto i = begin(result);
std::for_each(cbegin(testValues1), cend(testValues1), [&](const auto& A) { std::for_each(cbegin(testValues2), cend(testValues2), [&](const auto& B) { *i++ = A + B; }); });
return result;
}
int main() {
clock_t start;
clock_t total1 = 0;
clock_t total2 = 0;
auto first = &test1;
auto second = &test2;
srand(static_cast<unsigned int>(time(nullptr)));
for (auto i = 0; i < 100; ++i) {
auto testValues1 = createArrays();
auto testValues2 = createArrays();
start = clock();
const auto result1 = first(testValues1, testValues2);
total1 += clock() - start;
start = clock();
const auto result2 = second(testValues1, testValues2);
total2 += clock() - start;
if (!equal(cbegin(result1), cend(result1), cbegin(result2), cend(result2))) {
cout << "MISMATCH\n";
break;
}
swap(total1, total2);
swap(first, second);
}
cout << "Test1: " << total1 << endl << "Test2: " << total2 << endl;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPHZlY3Rvcj4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2ZWN0b3I8aW50PiBjcmVhdGVBcnJheXMoKSB7Cgl2ZWN0b3I8aW50PiByZXN1bHQocmFuZCgpICUgMTMpOwoKCWdlbmVyYXRlKHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCksIHJhbmQpOwoKCXJldHVybiByZXN1bHQ7Cn0KCnZlY3RvcjxpbnQ+IHRlc3QxKGNvbnN0IHZlY3RvcjxpbnQ+JiB0ZXN0VmFsdWVzMSwgY29uc3QgdmVjdG9yPGludD4mIHRlc3RWYWx1ZXMyKSB7Cgl2ZWN0b3I8aW50PiByZXN1bHQodGVzdFZhbHVlczEuc2l6ZSgpICogdGVzdFZhbHVlczIuc2l6ZSgpKTsKCglmb3JfZWFjaChiZWdpbihyZXN1bHQpLCBlbmQocmVzdWx0KSwgWyYsIGl0ID0gMFVdKGF1dG8mIGkpIG11dGFibGUgewoJCWkgPSB0ZXN0VmFsdWVzMVtpdCAvIHRlc3RWYWx1ZXMyLnNpemUoKV0gKyB0ZXN0VmFsdWVzMltpdCAlIHRlc3RWYWx1ZXMyLnNpemUoKV07CgkJKytpdDsKCX0pOwoKCXJldHVybiByZXN1bHQ7Cn0KCnZlY3RvcjxpbnQ+IHRlc3QyKGNvbnN0IHZlY3RvcjxpbnQ+JiB0ZXN0VmFsdWVzMSwgY29uc3QgdmVjdG9yPGludD4mIHRlc3RWYWx1ZXMyKSB7Cgl2ZWN0b3I8aW50PiByZXN1bHQodGVzdFZhbHVlczEuc2l6ZSgpICogdGVzdFZhbHVlczIuc2l6ZSgpKTsKCWF1dG8gaSA9IGJlZ2luKHJlc3VsdCk7CgoJc3RkOjpmb3JfZWFjaChjYmVnaW4odGVzdFZhbHVlczEpLCBjZW5kKHRlc3RWYWx1ZXMxKSwgWyZdKGNvbnN0IGF1dG8mIEEpIHsgc3RkOjpmb3JfZWFjaChjYmVnaW4odGVzdFZhbHVlczIpLCBjZW5kKHRlc3RWYWx1ZXMyKSwgWyZdKGNvbnN0IGF1dG8mIEIpIHsgKmkrKyA9IEEgKyBCOyB9KTsgfSk7CglyZXR1cm4gcmVzdWx0Owp9CgoKaW50IG1haW4oKSB7CgljbG9ja190IHN0YXJ0OwoJY2xvY2tfdCB0b3RhbDEgPSAwOwoJY2xvY2tfdCB0b3RhbDIgPSAwOwoJYXV0byBmaXJzdCA9ICZ0ZXN0MTsKCWF1dG8gc2Vjb25kID0gJnRlc3QyOwoKCXNyYW5kKHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4odGltZShudWxscHRyKSkpOwoKCWZvciAoYXV0byBpID0gMDsgaSA8IDEwMDsgKytpKSB7CgkJYXV0byB0ZXN0VmFsdWVzMSA9IGNyZWF0ZUFycmF5cygpOwoJCWF1dG8gdGVzdFZhbHVlczIgPSBjcmVhdGVBcnJheXMoKTsKCgkJc3RhcnQgPSBjbG9jaygpOwoJCWNvbnN0IGF1dG8gcmVzdWx0MSA9IGZpcnN0KHRlc3RWYWx1ZXMxLCB0ZXN0VmFsdWVzMik7CgkJdG90YWwxICs9IGNsb2NrKCkgLSBzdGFydDsKCgkJc3RhcnQgPSBjbG9jaygpOwoJCWNvbnN0IGF1dG8gcmVzdWx0MiA9IHNlY29uZCh0ZXN0VmFsdWVzMSwgdGVzdFZhbHVlczIpOwoJCXRvdGFsMiArPSBjbG9jaygpIC0gc3RhcnQ7CgoJCWlmICghZXF1YWwoY2JlZ2luKHJlc3VsdDEpLCBjZW5kKHJlc3VsdDEpLCBjYmVnaW4ocmVzdWx0MiksIGNlbmQocmVzdWx0MikpKSB7CgkJCWNvdXQgPDwgIk1JU01BVENIXG4iOwoJCQlicmVhazsKCQl9CgoJCXN3YXAodG90YWwxLCB0b3RhbDIpOwoJCXN3YXAoZmlyc3QsIHNlY29uZCk7Cgl9Cgljb3V0IDw8ICJUZXN0MTogIiA8PCB0b3RhbDEgPDwgZW5kbCA8PCAiVGVzdDI6ICIgPDwgdG90YWwyIDw8IGVuZGw7Cn0=