[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