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

Daniel P. Berrange berrange at redhat.com
Wed Apr 19 14:40:49 UTC 2017


On Wed, Apr 19, 2017 at 09:35:16AM -0500, Eric Blake wrote:
> 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;

If performance is critical, QEMU has a permissively licensed impl that
uses sse/avx instructions to super-optimize it on x86 (util/bufferiszero.c).
It is a large amount of code though, so only worth it if this is a notable
bottleneck for libguestfs.


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




More information about the Libguestfs mailing list