#include <chrono>
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
using namespace chrono;
int testcases[0xffffff];
void prepare_testcases()
{
for(size_t i = 0; i < sizeof(testcases)/sizeof(*testcases); i++)
{
testcases[i] = rand();
}
}
inline int cmp_normal(int i, int j)
{
return i == j;
}
inline int cmp_mem(int i, int j)
{
return memcmp(&i, &j, sizeof(int)) == 0;
}
high_resolution_clock::duration test(int(cmpfunc)(int, int))
{
auto tbegin = high_resolution_clock::now();
volatile int sink;
for(size_t i = 1; i < sizeof(testcases)/sizeof(*testcases); i++)
sink = cmpfunc(testcases[i], testcases[i-1]);
auto tend = high_resolution_clock::now();
return tend - tbegin;
}
int main()
{
prepare_testcases();
cout << "Normal comparison took " << duration_cast<milliseconds>(test(cmp_normal)).count() << " milliseconds." << endl;
cout << "Memory comparison took " << duration_cast<milliseconds>(test(cmp_mem)).count() << " milliseconds." << endl;
}
I2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KI2luY2x1ZGUgPGNzdHJpbmc+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIG5hbWVzcGFjZSBjaHJvbm87CgppbnQgdGVzdGNhc2VzWzB4ZmZmZmZmXTsKCnZvaWQgcHJlcGFyZV90ZXN0Y2FzZXMoKQp7Cglmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKHRlc3RjYXNlcykvc2l6ZW9mKCp0ZXN0Y2FzZXMpOyBpKyspCgl7CgkJdGVzdGNhc2VzW2ldID0gcmFuZCgpOwoJfQp9CgppbmxpbmUgaW50IGNtcF9ub3JtYWwoaW50IGksIGludCBqKQp7CglyZXR1cm4gaSA9PSBqOwp9CgppbmxpbmUgaW50IGNtcF9tZW0oaW50IGksIGludCBqKQp7CglyZXR1cm4gbWVtY21wKCZpLCAmaiwgc2l6ZW9mKGludCkpID09IDA7Cn0KCmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6ZHVyYXRpb24gdGVzdChpbnQoY21wZnVuYykoaW50LCBpbnQpKQp7CiAgYXV0byB0YmVnaW4gPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogIHZvbGF0aWxlIGludCBzaW5rOwogIGZvcihzaXplX3QgaSA9IDE7IGkgPCBzaXplb2YodGVzdGNhc2VzKS9zaXplb2YoKnRlc3RjYXNlcyk7IGkrKykKICAJc2luayA9IGNtcGZ1bmModGVzdGNhc2VzW2ldLCB0ZXN0Y2FzZXNbaS0xXSk7CiAgYXV0byB0ZW5kID0gaGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICByZXR1cm4gdGVuZCAtIHRiZWdpbjsKfQoKaW50IG1haW4oKQp7CiAgcHJlcGFyZV90ZXN0Y2FzZXMoKTsKCQogIGNvdXQgPDwgIk5vcm1hbCBjb21wYXJpc29uIHRvb2sgIiA8PCBkdXJhdGlvbl9jYXN0PG1pbGxpc2Vjb25kcz4odGVzdChjbXBfbm9ybWFsKSkuY291bnQoKSA8PCAiIG1pbGxpc2Vjb25kcy4iIDw8IGVuZGw7CiAgY291dCA8PCAiTWVtb3J5IGNvbXBhcmlzb24gdG9vayAiIDw8IGR1cmF0aW9uX2Nhc3Q8bWlsbGlzZWNvbmRzPih0ZXN0KGNtcF9tZW0pKS5jb3VudCgpIDw8ICIgbWlsbGlzZWNvbmRzLiIgPDwgZW5kbDsKfQ==