From 2aacaa6aba3a74ed11443b5fd76e9982964e42a5 Mon Sep 17 00:00:00 2001
From: Evgenii Stratonikov <evgeniy@nspcc.ru>
Date: Tue, 5 Apr 2022 11:33:36 +0300
Subject: [PATCH] refs: optimize marshalin of `[]ObjectID`

Signed-off-by: Evgenii Stratonikov <evgeniy@nspcc.ru>
---
 refs/marshal.go | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/refs/marshal.go b/refs/marshal.go
index 0a17a51c..dc8517f0 100644
--- a/refs/marshal.go
+++ b/refs/marshal.go
@@ -1,6 +1,8 @@
 package refs
 
 import (
+	"encoding/binary"
+
 	refs "github.com/nspcc-dev/neofs-api-go/v2/refs/grpc"
 	"github.com/nspcc-dev/neofs-api-go/v2/rpc/message"
 	"github.com/nspcc-dev/neofs-api-go/v2/util/proto"
@@ -114,8 +116,13 @@ func (o *ObjectID) StableSize() int {
 // ObjectIDNestedListMarshal writes protobuf repeated ObjectID field
 // with fNum number to buf.
 func ObjectIDNestedListMarshal(fNum int64, buf []byte, ids []ObjectID) (off int) {
+	prefix, _ := proto.NestedStructurePrefix(fNum)
 	for i := range ids {
-		off += proto.NestedStructureMarshal(fNum, buf[off:], &ids[i])
+		off += binary.PutUvarint(buf, prefix)
+
+		n := ids[i].StableSize()
+		off += binary.PutUvarint(buf[off:], uint64(n))
+		off += proto.BytesMarshal(objectIDValField, buf, ids[i].val)
 	}
 
 	return