mem: optimize.
authorRusty Russell <rusty@rustcorp.com.au>
Thu, 15 Oct 2015 04:20:34 +0000 (14:50 +1030)
committerRusty Russell <rusty@rustcorp.com.au>
Thu, 15 Oct 2015 05:14:32 +0000 (15:44 +1030)
Better for larger, worse for smaller compares.

Before:
1: 3ns
2: 3ns
4: 5ns
8: 9ns
16: 11ns
32: 33ns
64: 45ns
128: 87ns
256: 157ns
512: 296ns
1024: 579ns
2048: 1139ns
4096: 2251ns
8192: 4505ns
16384: 9704ns
32768: 18482ns
65536: 36144ns
2: 4ns
3: 6ns
5: 8ns
9: 9ns
17: 12ns
33: 22ns
65: 45ns
129: 90ns
257: 175ns
513: 357ns
1025: 607ns
2049: 1204ns
4097: 2278ns
8193: 4552ns
16385: 9011ns
32769: 18405ns
65537: 36153ns
total = 599391004

After:
1: 6ns
2: 7ns
4: 7ns
8: 7ns
16: 7ns
32: 8ns
64: 9ns
128: 13ns
256: 24ns
512: 47ns
1024: 92ns
2048: 185ns
4096: 376ns
8192: 739ns
16384: 1463ns
32768: 2914ns
65536: 5800ns
2: 7ns
3: 7ns
5: 7ns
9: 7ns
17: 7ns
33: 8ns
65: 9ns
129: 20ns
257: 31ns
513: 49ns
1025: 96ns
2049: 189ns
4097: 381ns
8193: 745ns
16385: 1477ns
32769: 2930ns
65537: 5824ns
total = 599391004

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ccan/mem/mem.c

index 2dfc72a506209511c0d61901024a470a28472d84..af41f9e011edbc6738667c3fc89d9d043b1dbcf6 100644 (file)
@@ -92,12 +92,13 @@ void memswap(void *a, void *b, size_t n)
 bool memeqzero(const void *data, size_t length)
 {
        const unsigned char *p = data;
+       static unsigned long zeroes[16];
 
-       while (length) {
-               if (*p)
+       while (length > sizeof(zeroes)) {
+               if (memcmp(zeroes, p, sizeof(zeroes)))
                        return false;
-               p++;
-               length--;
+               p += sizeof(zeroes);
+               length -= sizeof(zeroes);
        }
-       return true;
+       return memcmp(zeroes, p, length) == 0;
 }