File tree 2 files changed +36
-2
lines changed 2 files changed +36
-2
lines changed Original file line number Diff line number Diff line change @@ -480,8 +480,17 @@ var structSize sync.Map // map[reflect.Type]int
480
480
func dataSize (v reflect.Value ) int {
481
481
switch v .Kind () {
482
482
case reflect .Slice :
483
- if s := sizeof (v .Type ().Elem ()); s >= 0 {
484
- return s * v .Len ()
483
+ t := v .Type ().Elem ()
484
+ if size , ok := structSize .Load (t ); ok {
485
+ return size .(int ) * v .Len ()
486
+ }
487
+
488
+ size := sizeof (t )
489
+ if size >= 0 {
490
+ if t .Kind () == reflect .Struct {
491
+ structSize .Store (t , size )
492
+ }
493
+ return size * v .Len ()
485
494
}
486
495
487
496
case reflect .Struct :
Original file line number Diff line number Diff line change @@ -631,6 +631,31 @@ func BenchmarkWriteStruct(b *testing.B) {
631
631
}
632
632
}
633
633
634
+ func BenchmarkWriteSlice1000Structs (b * testing.B ) {
635
+ slice := make ([]Struct , 1000 )
636
+ buf := new (bytes.Buffer )
637
+ var w io.Writer = buf
638
+ b .SetBytes (int64 (Size (slice )))
639
+ b .ResetTimer ()
640
+ for i := 0 ; i < b .N ; i ++ {
641
+ buf .Reset ()
642
+ Write (w , BigEndian , slice )
643
+ }
644
+ b .StopTimer ()
645
+ }
646
+
647
+ func BenchmarkReadSlice1000Structs (b * testing.B ) {
648
+ bsr := & byteSliceReader {}
649
+ slice := make ([]Struct , 1000 )
650
+ buf := make ([]byte , Size (slice ))
651
+ b .SetBytes (int64 (len (buf )))
652
+ b .ResetTimer ()
653
+ for i := 0 ; i < b .N ; i ++ {
654
+ bsr .remain = buf
655
+ Read (bsr , BigEndian , slice )
656
+ }
657
+ }
658
+
634
659
func BenchmarkReadInts (b * testing.B ) {
635
660
var ls Struct
636
661
bsr := & byteSliceReader {}
You can’t perform that action at this time.
0 commit comments