diff --git a/internal/storage/payload_benchmark_test.go b/internal/storage/payload_benchmark_test.go new file mode 100644 index 0000000000..4a89e025ed --- /dev/null +++ b/internal/storage/payload_benchmark_test.go @@ -0,0 +1,212 @@ +package storage + +import ( + "math/rand" + "testing" + + "github.com/milvus-io/milvus/internal/proto/schemapb" +) + +// workload setting for benchmark +const ( + numElements = 1000 + vectorDim = 8 +) + +func BenchmarkPayloadReader_Bool(b *testing.B) { + w, _ := NewPayloadWriter(schemapb.DataType_Bool) + defer w.ReleasePayloadWriter() + data := make([]bool, 0, numElements) + for i := 0; i < numElements; i++ { + data = append(data, rand.Intn(2) != 0) + } + w.AddBoolToPayload(data) + w.FinishPayloadWriter() + buffer, _ := w.GetPayloadBufferFromWriter() + + b.Run("cgo reader", func(b *testing.B) { + for i := 0; i < b.N; i++ { + r, _ := NewPayloadReaderCgo(schemapb.DataType_Bool, buffer) + r.GetBoolFromPayload() + r.ReleasePayloadReader() + } + }) + + b.Run("go reader", func(b *testing.B) { + for i := 0; i < b.N; i++ { + r, _ := NewPayloadReader(schemapb.DataType_Bool, buffer) + r.GetBoolFromPayload() + r.ReleasePayloadReader() + } + }) +} + +func BenchmarkPayloadReader_Int32(b *testing.B) { + w, _ := NewPayloadWriter(schemapb.DataType_Int32) + defer w.ReleasePayloadWriter() + data := make([]int32, 0, numElements) + for i := 0; i < numElements; i++ { + data = append(data, rand.Int31n(1000)) + } + w.AddInt32ToPayload(data) + w.FinishPayloadWriter() + buffer, _ := w.GetPayloadBufferFromWriter() + + b.Run("cgo reader", func(b *testing.B) { + for i := 0; i < b.N; i++ { + r, _ := NewPayloadReaderCgo(schemapb.DataType_Int32, buffer) + r.GetInt32FromPayload() + r.ReleasePayloadReader() + } + }) + + b.Run("go reader", func(b *testing.B) { + for i := 0; i < b.N; i++ { + r, _ := NewPayloadReader(schemapb.DataType_Int32, buffer) + r.GetInt32FromPayload() + r.ReleasePayloadReader() + } + }) +} + +func BenchmarkPayloadReader_Int64(b *testing.B) { + w, _ := NewPayloadWriter(schemapb.DataType_Int64) + defer w.ReleasePayloadWriter() + data := make([]int64, 0, numElements) + for i := 0; i < numElements; i++ { + data = append(data, rand.Int63n(1000)) + } + w.AddInt64ToPayload(data) + w.FinishPayloadWriter() + buffer, _ := w.GetPayloadBufferFromWriter() + + b.Run("cgo reader", func(b *testing.B) { + for i := 0; i < b.N; i++ { + r, _ := NewPayloadReaderCgo(schemapb.DataType_Int64, buffer) + r.GetInt64FromPayload() + r.ReleasePayloadReader() + } + }) + + b.Run("go reader", func(b *testing.B) { + for i := 0; i < b.N; i++ { + r, _ := NewPayloadReader(schemapb.DataType_Int64, buffer) + r.GetInt64FromPayload() + r.ReleasePayloadReader() + } + }) +} + +func BenchmarkPayloadReader_Float32(b *testing.B) { + w, _ := NewPayloadWriter(schemapb.DataType_Float) + defer w.ReleasePayloadWriter() + data := make([]float32, 0, numElements) + for i := 0; i < numElements; i++ { + data = append(data, rand.Float32()) + } + w.AddFloatToPayload(data) + w.FinishPayloadWriter() + buffer, _ := w.GetPayloadBufferFromWriter() + + b.Run("cgo reader", func(b *testing.B) { + for i := 0; i < b.N; i++ { + r, _ := NewPayloadReaderCgo(schemapb.DataType_Float, buffer) + r.GetFloatFromPayload() + r.ReleasePayloadReader() + } + }) + + b.Run("go reader", func(b *testing.B) { + for i := 0; i < b.N; i++ { + r, _ := NewPayloadReader(schemapb.DataType_Float, buffer) + r.GetFloatFromPayload() + r.ReleasePayloadReader() + } + }) +} + +func BenchmarkPayloadReader_Float64(b *testing.B) { + w, _ := NewPayloadWriter(schemapb.DataType_Double) + defer w.ReleasePayloadWriter() + data := make([]float64, 0, numElements) + for i := 0; i < numElements; i++ { + data = append(data, rand.Float64()) + } + w.AddDoubleToPayload(data) + w.FinishPayloadWriter() + buffer, _ := w.GetPayloadBufferFromWriter() + + b.Run("cgo reader", func(b *testing.B) { + for i := 0; i < b.N; i++ { + r, _ := NewPayloadReaderCgo(schemapb.DataType_Double, buffer) + r.GetDoubleFromPayload() + r.ReleasePayloadReader() + } + }) + + b.Run("go reader", func(b *testing.B) { + for i := 0; i < b.N; i++ { + r, _ := NewPayloadReader(schemapb.DataType_Double, buffer) + r.GetDoubleFromPayload() + r.ReleasePayloadReader() + } + }) +} + +func BenchmarkPayloadReader_FloatVector(b *testing.B) { + w, _ := NewPayloadWriter(schemapb.DataType_FloatVector) + defer w.ReleasePayloadWriter() + data := make([]float32, 0, numElements*vectorDim) + for i := 0; i < numElements; i++ { + data = append(data, rand.Float32()) + } + w.AddFloatVectorToPayload(data, vectorDim) + w.FinishPayloadWriter() + buffer, _ := w.GetPayloadBufferFromWriter() + + b.Run("cgo reader", func(b *testing.B) { + for i := 0; i < b.N; i++ { + r, _ := NewPayloadReaderCgo(schemapb.DataType_FloatVector, buffer) + r.GetFloatVectorFromPayload() + r.ReleasePayloadReader() + } + }) + + b.Run("go reader", func(b *testing.B) { + for i := 0; i < b.N; i++ { + r, _ := NewPayloadReader(schemapb.DataType_FloatVector, buffer) + r.GetFloatVectorFromPayload() + r.ReleasePayloadReader() + } + }) +} + +func BenchmarkPayloadReader_BinaryVector(b *testing.B) { + w, _ := NewPayloadWriter(schemapb.DataType_BinaryVector) + defer w.ReleasePayloadWriter() + data := make([]byte, numElements*vectorDim/8) + rand.Read(data) + + err := w.AddBinaryVectorToPayload(data, vectorDim) + if err != nil { + panic(err) + } + w.FinishPayloadWriter() + buffer, _ := w.GetPayloadBufferFromWriter() + + b.Run("cgo reader", func(b *testing.B) { + for i := 0; i < b.N; i++ { + r, _ := NewPayloadReaderCgo(schemapb.DataType_BinaryVector, buffer) + r.GetBinaryVectorFromPayload() + r.ReleasePayloadReader() + } + }) + + b.Run("go reader", func(b *testing.B) { + for i := 0; i < b.N; i++ { + r, _ := NewPayloadReader(schemapb.DataType_BinaryVector, buffer) + r.GetBinaryVectorFromPayload() + r.ReleasePayloadReader() + } + }) +} diff --git a/internal/storage/payload_cgo_test.go b/internal/storage/payload_cgo_test.go index 6ac0bc3997..1b2caae494 100644 --- a/internal/storage/payload_cgo_test.go +++ b/internal/storage/payload_cgo_test.go @@ -20,12 +20,12 @@ import ( "fmt" "testing" - "github.com/milvus-io/milvus/internal/proto/schemapb" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/milvus-io/milvus/internal/proto/schemapb" ) -// TODO Cgo test can not go through on mac, fix it func TestPayload_CGO_ReaderandWriter(t *testing.T) { t.Run("TestBool", func(t *testing.T) { @@ -48,7 +48,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_Bool, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_Bool, buffer) require.Nil(t, err) length, err = r.GetPayloadLengthFromReader() assert.Nil(t, err) @@ -84,7 +84,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_Int8, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_Int8, buffer) require.Nil(t, err) length, err = r.GetPayloadLengthFromReader() assert.Nil(t, err) @@ -122,7 +122,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_Int16, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_Int16, buffer) require.Nil(t, err) length, err = r.GetPayloadLengthFromReader() assert.Nil(t, err) @@ -158,7 +158,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_Int32, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_Int32, buffer) require.Nil(t, err) length, err = r.GetPayloadLengthFromReader() assert.Nil(t, err) @@ -195,7 +195,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_Int64, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_Int64, buffer) require.Nil(t, err) length, err = r.GetPayloadLengthFromReader() assert.Nil(t, err) @@ -232,7 +232,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_Float, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_Float, buffer) require.Nil(t, err) length, err = r.GetPayloadLengthFromReader() assert.Nil(t, err) @@ -269,7 +269,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_Double, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_Double, buffer) require.Nil(t, err) length, err = r.GetPayloadLengthFromReader() assert.Nil(t, err) @@ -307,7 +307,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_String, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_String, buffer) assert.Nil(t, err) length, err = r.GetPayloadLengthFromReader() assert.Nil(t, err) @@ -361,7 +361,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_BinaryVector, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_BinaryVector, buffer) require.Nil(t, err) length, err = r.GetPayloadLengthFromReader() assert.Nil(t, err) @@ -401,7 +401,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_FloatVector, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_FloatVector, buffer) require.Nil(t, err) length, err = r.GetPayloadLengthFromReader() assert.Nil(t, err) @@ -621,7 +621,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { t.Run("TestNewReadError", func(t *testing.T) { buffer := []byte{0} - r, err := NewPayloadReaderGgo(999, buffer) + r, err := NewPayloadReaderCgo(999, buffer) assert.NotNil(t, err) assert.Nil(t, r) }) @@ -646,7 +646,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_Bool, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_Bool, buffer) assert.Nil(t, err) _, err = r.GetBoolFromPayload() @@ -670,7 +670,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_Int8, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_Int8, buffer) assert.Nil(t, err) _, err = r.GetInt8FromPayload() @@ -694,7 +694,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_Int16, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_Int16, buffer) assert.Nil(t, err) _, err = r.GetInt16FromPayload() @@ -718,7 +718,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_Int32, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_Int32, buffer) assert.Nil(t, err) _, err = r.GetInt32FromPayload() @@ -742,7 +742,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_Int64, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_Int64, buffer) assert.Nil(t, err) _, err = r.GetInt64FromPayload() @@ -766,7 +766,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_Float, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_Float, buffer) assert.Nil(t, err) _, err = r.GetFloatFromPayload() @@ -790,7 +790,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_Double, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_Double, buffer) assert.Nil(t, err) _, err = r.GetDoubleFromPayload() @@ -814,7 +814,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_String, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_String, buffer) assert.Nil(t, err) _, err = r.GetStringFromPayload() @@ -838,7 +838,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_BinaryVector, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_BinaryVector, buffer) assert.Nil(t, err) _, _, err = r.GetBinaryVectorFromPayload() @@ -862,7 +862,7 @@ func TestPayload_CGO_ReaderandWriter(t *testing.T) { buffer, err := w.GetPayloadBufferFromWriter() assert.Nil(t, err) - r, err := NewPayloadReaderGgo(schemapb.DataType_FloatVector, buffer) + r, err := NewPayloadReaderCgo(schemapb.DataType_FloatVector, buffer) assert.Nil(t, err) _, _, err = r.GetFloatVectorFromPayload() diff --git a/internal/storage/payload_reader_cgo.go b/internal/storage/payload_reader_cgo.go index 0a063773e9..76af4beeb0 100644 --- a/internal/storage/payload_reader_cgo.go +++ b/internal/storage/payload_reader_cgo.go @@ -13,19 +13,20 @@ import "C" import ( "errors" "fmt" + "unsafe" + "github.com/milvus-io/milvus/internal/log" "github.com/milvus-io/milvus/internal/proto/commonpb" "github.com/milvus-io/milvus/internal/proto/schemapb" - "unsafe" ) -// PayloadReader reads data from payload +// PayloadReaderCgo reads data from payload type PayloadReaderCgo struct { payloadReaderPtr C.CPayloadReader colType schemapb.DataType } -func NewPayloadReaderGgo(colType schemapb.DataType, buf []byte) (*PayloadReaderCgo, error) { +func NewPayloadReaderCgo(colType schemapb.DataType, buf []byte) (*PayloadReaderCgo, error) { if len(buf) == 0 { return nil, errors.New("create Payload reader failed, buffer is empty") }