Czemu błąd wykonania??

0

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;
    }

http://ideone.com/5zpRct

Niestety, z przyczyn dla mnie niepoznanych, bechmark wywala błąd wykonania.

CO robię źle?

2
i < sizeof(testcases)

Wracamy do podstaw: co robi sizeof? ;​) Po Tobie bym się tego nie spodziewał.

std::size lub sizeof(testcases)/sizeof(*testcases)

Dodatkowo: dlaczego w cmp_mem używasz memcpy, a nie memcmp?

1

Liczba elementów w tablicy to

sizeof(testcases) / sizeof(int)
0

A zatem odpowiedź: Tak, jest wolniejsze i to sporo:

Normal comparison took 30 milliseconds.
Memory comparison took 102 milliseconds.

Zwiększyłem rozmiar tablicy do 0xffffff.

http://ideone.com/1nXMmm

0

Kompilujesz z optymalizacjami? Zamieniłeś memcpy na memcmp?

U mnie na archu clang i gcc dają bardzo porównywalne wyniki.

gcc7 i clang4 generują dla obu funkcji identyczny kod: https://godbolt.org/g/f6Dju3

0

memcmp na memcpy zamieniłem, a co do optymalizacji: głupio założyłem, że ideone ma ją włączoną domyślnie, co było bzdurą.

Z włączoną optymalizacją porównywalnie: https://wandbox.org/permlink/LwaKdTCSeQe1rAZY

1 użytkowników online, w tym zalogowanych: 0, gości: 1