Chciałem sprawdzić, czy porównywanie liczb poprzez porównywanie ich reprezentacji w pamięci jest dużo wolniejsze niż za pomocą operatora == ?
W tym celu napisałem ten oto benchmark:
#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;
}
Niestety, z przyczyn dla mnie niepoznanych, bechmark wywala błąd wykonania.
CO robię źle?