[Libguestfs] [PATCH libnbd 5/9] golang: aio_buffer.go: Add Slice()

Nir Soffer nsoffer at redhat.com
Thu Feb 10 21:10:55 UTC 2022


On Tue, Feb 1, 2022 at 3:12 PM Eric Blake <eblake at redhat.com> wrote:
>
> On Sun, Jan 30, 2022 at 01:33:33AM +0200, Nir Soffer wrote:
> > AioBuffer.Bytes() cannot be used for coping images from NBD to other
>
> copying
>
> > APis because it copies the entire image. Add a new Slice() function,
> > creating a slice backed by the underling buffer.
>
> underlying
>
> >
> > Using Slice() is efficient, but less safe, like Get(). The returned
> > slice must be used only before calling Free(). This should not be an
> > issue with typical code.
> >
> > Testing show that Slice() is much faster than Bytes() for typical 256k
> > buffer:
> >
> > BenchmarkAioBufferBytes-12               86616             16529 ns/op
> > BenchmarkAioBufferSlice-12            1000000000               0.4630 ns/op
> >
> > I modified the aio_copy example to use AioBuffer and complied 2
>
> compiled
>
> > +++ b/golang/libnbd_620_aio_buffer_test.go
> > @@ -44,20 +44,35 @@ func TestAioBuffer(t *testing.T) {
> >       /* Modifying returned slice does not modify the buffer. */
> >       for i := 0; i < len(b); i++ {
> >               b[i] = 42
> >       }
> >
> >       /* Bytes() still returns zeroes. */
> >       if !bytes.Equal(buf.Bytes(), zeroes) {
> >               t.Fatalf("Expected %v, got %v", zeroes, buf.Bytes())
> >       }
> >
> > +     /* Creating a slice without copying the underlhing buffer. */
>
> underlying
>
> > +     s := buf.Slice()
> > +     if !bytes.Equal(s, zeroes) {
> > +             t.Fatalf("Expected %v, got %v", zeroes, s)
> > +     }
> > +
> > +     /* Modifing the slice modifies the underlying buffer. */
>
> Modifying
>
> >  }
> > +
> > +// Benchmark creating a slice without copying the underling buffer.
>
> underlying
>
> > +func BenchmarkAioBufferSlice(b *testing.B) {
> > +     buf := MakeAioBuffer(bufferSize)
> > +     defer buf.Free()
> > +     var r int
> > +
> > +     b.ResetTimer()
> > +     for i := 0; i < b.N; i++ {
> > +             r += len(buf.Slice())
> > +     }
> > +}
> > --
> > 2.34.1

Will fix in v2




More information about the Libguestfs mailing list