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;
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
--
|: