surprising optimization of comparison operations for __int128_t
Mathieu Lacage
mathieu.lacage@gmail.com
Fri Jul 9 09:29:00 GMT 2010
hi,
The attached C++ testcase compares the performance behavior of
__int128_t used directly vs __int128_t used through an overloaded
operator <. The overloaded < operator appears faster than the raw
__int128_t which I find really surprising so, I fear I am not
measuring what I think I am measuring. Hints ?
[mathieu@mathieu-laptop benchmark-time]$ g++ --version
g++ (GCC) 4.4.3 20100127 (Red Hat 4.4.3-4)
[mathieu@mathieu-laptop benchmark-time]$ g++ -O3 test.cc
# run raw __int128_t version
[mathieu@mathieu-laptop benchmark-time]$ time -p ./a.out 100000002 a
16384
2
real 0.60
user 0.60
sys 0.00
# run operator < version
[mathieu@mathieu-laptop benchmark-time]$ time -p ./a.out 100000002 test
16384
2
real 0.40
user 0.40
sys 0.00
Mathieu
--
Mathieu Lacage <mathieu.lacage@gmail.com>
-------------- next part --------------
#include <iostream>
#include <stdlib.h>
#include <string.h>
struct Test
{
inline Test () : v (0) {}
inline Test (int _v) : v (_v) {}
__int128_t v;
};
inline bool operator < (const Test &a, const Test &b)
{
return a.v < b.v;
}
#define CMP_SIZE 1024
template <typename T>
T
run_cmp (T a, T b, long int n)
{
#define SIZE 1024
bool cmp = false;
T array[SIZE];
int count = 0;
std::cout << sizeof(array) << std::endl;
for (int i = 0; i < SIZE; i++)
{
array[i] = b;
}
for (long int i = 0; i < n; i++)
{
if (a < array[i%SIZE])
{
count++;
}
}
return count&0x1?a:b;
}
int main (int argc, char *argv[])
{
long int n = atoi (argv[1]);
int test = strcmp (argv[2], "test") == 0;
if (test)
{
Test result = run_cmp<struct Test> (Test (1), Test (2), n);
std::cout << (long int) result.v << std::endl;
}
else
{
__int128_t result = run_cmp<__int128_t> (1, 2, n);
std::cout << (long int)result << std::endl;
}
return 0;
}
More information about the Gcc-help
mailing list