[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [Libguestfs] [PATCH] daemon: Move the useful 'is_zero' function into common code.



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-empty-buffer-in-c/1493989#1493989
> + */
> +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

Attachment: signature.asc
Description: OpenPGP digital signature


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]