#include #include #include __attribute__((noinline)) int cmpi(unsigned int x, unsigned int y) { return __builtin_memcmp(&x,&y,4); } __attribute__((noinline)) int cmpi2(unsigned int x, unsigned int y) { asm("bswap %0" : "+r"(x)); asm("bswap %0" : "+r"(y)); return x - y; } __attribute__((noinline)) int cmpa(unsigned int * x, unsigned int * y, size_t size) { return __builtin_memcmp(x,y,size); } __attribute__((noinline)) int cmpa2(unsigned int * x, unsigned int * y, size_t size) { int i = 0; size /= 4; while (i < size && x[i] == y[i]) ++i; if (i == size) return 0; asm("bswap %0" : "+r"(x[i])); asm("bswap %0" : "+r"(y[i])); return x[i] - y[i]; } int main() { unsigned int x,y,i; int xa[256] = {}, ya[256] = {}; int s,f; clock_t t; x = *(unsigned int *)("a b"); y = *(unsigned int *)("b a"); printf("Memory compare int:\n"); t = clock(); for (i = 0; i != 0x1000000; ++i) cmpi(x,y); s = clock() - t; printf(" %d\n", s); t = clock(); for (i = 0; i != 0x1000000; ++i) cmpi2(x,y); f = clock() - t; printf(" %d\n",f); printf(" Speed up: %f\n", (double)s/f); printf("Memory compare 16 bytes:\n"); xa[3] = 6; t = clock(); for (i = 0; i != 0x1000000; ++i) cmpa(xa, ya, 16); s = clock() - t; printf(" %d\n", s); t = clock(); for (i = 0; i != 0x1000000; ++i) cmpa2(xa, ya, 16); f = clock() - t; printf(" %d\n",f); printf(" Speed up: %f\n", (double)s/f); xa[3] = 0; xa[15] = 6; printf("Memory compare 64 bytes:\n"); t = clock(); for (i = 0; i != 0x1000000; ++i) cmpa(xa, ya, 64); s = clock() - t; printf(" %d\n", s); t = clock(); for (i = 0; i != 0x1000000; ++i) cmpa2(xa, ya, 64); f = clock() - t; printf(" %d\n",f); printf(" Speed up: %f\n", (double)s/f); xa[15] = 0; xa[255] = 6; printf("Memory compare 256 bytes:\n"); t = clock(); for (i = 0; i != 0x1000000; ++i) cmpa(xa, ya, 256); s = clock() - t; printf(" %d\n", s); t = clock(); for (i = 0; i != 0x1000000; ++i) cmpa2(xa, ya, 256); f = clock() - t; printf(" %d\n",f); printf(" Speed up: %f\n", (double)s/f); }