#include <iostream> #include <chrono> #include <cstdlib> #include <cassert> template<typename T, class = typename std::enable_if<std::is_integral<T>::value>::type> void swap_xor(T &a, T &b) {a ^= b; b ^= a; a ^= b;} int main() { double avgstd = 0.0, avgxor = 0.0; unsigned long long nbP = 0; int a, b, c; for(unsigned int i = 0; i<1000000; ++i) { a = c = rand(); b = rand(); auto start = std::chrono::steady_clock::now(); std::swap(a,b); auto t1 = std::chrono::steady_clock::now(); swap_xor(a,b); auto end = std::chrono::steady_clock::now(); assert(a==c); unsigned long long tstd = std::chrono::duration_cast<std::chrono::nanoseconds> (t1-start).count(); unsigned long long txor = std::chrono::duration_cast<std::chrono::nanoseconds> (end-t1).count(); avgstd = (avgstd*nbP + tstd)/(nbP+1); avgxor = (avgxor*nbP + txor)/(nbP+1); ++nbP; } std::cout << "Timing for swaps, averaged on " <<nbP<<" swaps. In nanoseconds.\n"; std::cout << "std swap: "<<avgstd <<" ns. XOR swaps: "<<avgxor <<" ns."<<std::endl; return 0; }