From: Rusty Russell Date: Thu, 15 Oct 2015 04:20:34 +0000 (+1030) Subject: mem: optimize. X-Git-Url: http://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=b967dac8c71a2313c39910ef8ca0e1644fe178c0 mem: optimize. 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 --- diff --git a/ccan/mem/mem.c b/ccan/mem/mem.c index 2dfc72a5..af41f9e0 100644 --- a/ccan/mem/mem.c +++ b/ccan/mem/mem.c @@ -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; }