#include #include #include __attribute__((noinline)) int cmpa(const unsigned int * x, const unsigned int * y, size_t size) { return __builtin_memcmp(x,y,size); } __attribute__((noinline)) int cmpa2(const unsigned int * x, const unsigned int * y, size_t size) { int i = 0; size_t s = size / 4; while (i < s && x[i] == y[i]) ++i; size -= i * 4; if (size == 0) return 0; unsigned int xx = x[i], yy = y[i]; asm("bswap %0" : "+r"(xx)); asm("bswap %0" : "+r"(yy)); if (size >= 4) { return xx < yy ? -1 : 1; } else { unsigned int dis = 8*(4-size); xx >>= dis; yy >>= dis; return xx - yy; } } int main() { unsigned int x,y,i; int xa[256] = {}, ya[256] = {}; int s,f; clock_t t; printf("Memory compare 15 bytes:\n"); xa[3] = 6; t = clock(); for (i = 0; i != 0x1000000; ++i) cmpa(xa, ya, 15); s = clock() - t; printf(" %d\n", s); t = clock(); for (i = 0; i != 0x1000000; ++i) cmpa2(xa, ya, 15); f = clock() - t; printf(" %d\n",f); printf(" Speed up: %f\n", (double)s/f); xa[3] = 0; 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; printf("Memory compare 64 bytes:\n"); xa[15] = 6; 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; printf("Memory compare 256 bytes:\n"); xa[63] = 6; 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); }