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-a...
+ */
+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