#include <iostream>
#include <tuple>
#include <chrono>
using namespace std;
using namespace std::chrono;
void safe_swap(int* a, int* b) {
if (a != b)
*b ^= *a ^= *b, *a ^= *b;
}
void classic_swap(int*a, int*b) {
if (a!=b) {
int tmp;
tmp=*a;*a=*b;*b=tmp;
}
}
void modern_swap(int*a, int*b) {
if (a!=b)
tie(*a,*b)=make_pair(*b,*a);
}
long long benchmark(void(*f)(int*,int*)) {
int a,b;
long long mytime;
high_resolution_clock::time_point t = high_resolution_clock::now();
a = rand();
for (unsigned i=0; i<200000000; i++) {
b = rand();
f(&a,&b);
}
high_resolution_clock::time_point t2 = high_resolution_clock::now();
mytime = duration_cast<milliseconds>(t2 - t).count();
return mytime;
}
int main() {
auto t1 = benchmark (safe_swap);
auto t2 = benchmark (modern_swap);
cout << "xor: "<<t1<<" ms" <<endl;
cout << "modern:"<<t2<<" ms" <<endl;
cout << "rel xor time: " << static_cast<double>(t1)/t2*100 <<"%"<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDxjaHJvbm8+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ubzsKCnZvaWQgc2FmZV9zd2FwKGludCogYSwgaW50KiBiKSB7CiAgICBpZiAoYSAhPSBiKQogICAgICAgICpiIF49ICphIF49ICpiLCAqYSBePSAqYjsKfQp2b2lkIGNsYXNzaWNfc3dhcChpbnQqYSwgaW50KmIpIHsKICAgIGlmIChhIT1iKSB7CiAgICAgICAgaW50IHRtcDsgCiAgICAgICAgdG1wPSphOyphPSpiOypiPXRtcDsKICAgIH0gICAKfQp2b2lkIG1vZGVybl9zd2FwKGludCphLCBpbnQqYikgewogICAgaWYgKGEhPWIpIAogICAgICAgIHRpZSgqYSwqYik9bWFrZV9wYWlyKCpiLCphKTsKfQoKbG9uZyBsb25nIGJlbmNobWFyayh2b2lkKCpmKShpbnQqLGludCopKSB7CglpbnQgYSxiOyAKCWxvbmcgbG9uZyBteXRpbWU7CgloaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdCA9IGhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CglhID0gcmFuZCgpOyAKCQkKCWZvciAodW5zaWduZWQgaT0wOyBpPDIwMDAwMDAwMDsgaSsrKSB7CgkJYiA9IHJhbmQoKTsKCQlmKCZhLCZiKTsgCgl9CgloaWdoX3Jlc29sdXRpb25fY2xvY2s6OnRpbWVfcG9pbnQgdDIgPSBoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwoJbXl0aW1lID0gZHVyYXRpb25fY2FzdDxtaWxsaXNlY29uZHM+KHQyIC0gdCkuY291bnQoKTsKCXJldHVybiBteXRpbWU7IAp9CgppbnQgbWFpbigpIHsKCWF1dG8gdDEgPSBiZW5jaG1hcmsgKHNhZmVfc3dhcCk7CglhdXRvIHQyID0gYmVuY2htYXJrIChtb2Rlcm5fc3dhcCk7Cgljb3V0IDw8ICJ4b3I6ICAgIjw8dDE8PCIgbXMiIDw8ZW5kbDsKCWNvdXQgPDwgIm1vZGVybjoiPDx0Mjw8IiBtcyIgPDxlbmRsOwoJY291dCA8PCAicmVsIHhvciB0aW1lOiAiIDw8IHN0YXRpY19jYXN0PGRvdWJsZT4odDEpL3QyKjEwMCA8PCIlIjw8ZW5kbDsKCXJldHVybiAwOwp9