On 04/19/2017 09:17 AM, Richard W.M. Jones wrote:
This is largely a simple refactoring, but it combines another definition of this function from virt-builder which had a slightly different prototype. ---
+/* Return true iff the buffer is all zero bytes. + * + * Note that gcc is smart enough to optimize this properly: + * http://stackoverflow.com/questions/1493936/faster-means-of-checking-for-an-e... + */ +static inline int +is_zero (const char *buffer, size_t size) +{ + size_t i; + + for (i = 0; i < size; ++i) { + if (buffer[i] != 0) + return 0; + } + + return 1; +}
This is still byte-at-a-time. Often, you can get even faster results by exploiting libc's optimizations in memcmp (particularly when it is comparing pointers with nice alignments), by manually checking that the first 16 bytes are zero, then letting memcmp do the rest: size_t i; size_t limit = MIN(size, 16); for (i = 0; i < limit; ++i) if (buffer[i]) return 0; if (size != limit) return !memcmp(buffer, buffer + 16, size - 16); return 1; -- Eric Blake, Principal Software Engineer Red Hat, Inc. +1-919-301-3266 Virtualization: qemu.org | libvirt.org