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>
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;
}