#include <chrono>
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
using namespace chrono;
int testcases[0xffff];
void prepare_testcases()
{
for(size_t i = 0; i < 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 memcpy(&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); 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+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIG5hbWVzcGFjZSBjaHJvbm87CgppbnQgdGVzdGNhc2VzWzB4ZmZmZl07Cgp2b2lkIHByZXBhcmVfdGVzdGNhc2VzKCkKewoJZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZih0ZXN0Y2FzZXMpOyBpKyspCgl7CgkJdGVzdGNhc2VzW2ldID0gcmFuZCgpOwoJfQp9CgppbmxpbmUgaW50IGNtcF9ub3JtYWwoaW50IGksIGludCBqKQp7CglyZXR1cm4gaSA9PSBqOwp9CgppbmxpbmUgaW50IGNtcF9tZW0oaW50IGksIGludCBqKQp7CglyZXR1cm4gbWVtY3B5KCZpLCAmaiwgc2l6ZW9mKGludCkpID09IDA7Cn0KCmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6ZHVyYXRpb24gdGVzdChpbnQoY21wZnVuYykoaW50LCBpbnQpKQp7CiAgYXV0byB0YmVnaW4gPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogIHZvbGF0aWxlIGludCBzaW5rOwogIGZvcihzaXplX3QgaSA9IDE7IGkgPCBzaXplb2YodGVzdGNhc2VzKTsgaSsrKQogIAlzaW5rID0gY21wZnVuYyh0ZXN0Y2FzZXNbaV0sIHRlc3RjYXNlc1tpLTFdKTsKICBhdXRvIHRlbmQgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogIHJldHVybiB0ZW5kIC0gdGJlZ2luOwp9CgppbnQgbWFpbigpCnsKICBwcmVwYXJlX3Rlc3RjYXNlcygpOwoJCiAgY291dCA8PCAiTm9ybWFsIGNvbXBhcmlzb24gdG9vayAiIDw8IGR1cmF0aW9uX2Nhc3Q8bWlsbGlzZWNvbmRzPih0ZXN0KGNtcF9ub3JtYWwpKS5jb3VudCgpIDw8ICIgbWlsbGlzZWNvbmRzLiIgPDwgZW5kbDsKICBjb3V0IDw8ICJNZW1vcnkgY29tcGFyaXNvbiB0b29rICIgPDwgZHVyYXRpb25fY2FzdDxtaWxsaXNlY29uZHM+KHRlc3QoY21wX21lbSkpLmNvdW50KCkgPDwgIiBtaWxsaXNlY29uZHMuIiA8PCBlbmRsOwp9