| // Copyright 2026 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package test |
| |
| import "testing" |
| |
| // From issue #77720. |
| type moveLoadBenchHandle[T any] struct { |
| value *T |
| } |
| |
| func (h moveLoadBenchHandle[T]) Value() T { |
| return *h.value |
| } |
| |
| type moveLoadBenchBig struct { |
| typ int8 |
| index int64 |
| str string |
| pkgID string |
| dummyField [1024]byte |
| } |
| |
| type moveLoadBenchS struct { |
| h moveLoadBenchHandle[moveLoadBenchBig] |
| } |
| |
| var moveLoadBenchSink int8 |
| |
| func moveLoadBenchTypViaValue(s moveLoadBenchS) int8 { |
| return s.h.Value().typ |
| } |
| |
| func moveLoadBenchTypViaPtr(s moveLoadBenchS) int8 { |
| return (*s.h.value).typ |
| } |
| |
| func benchmarkMoveLoad(b *testing.B, f func(moveLoadBenchS) int8) { |
| backing := make([]moveLoadBenchBig, 1<<10) |
| ss := make([]moveLoadBenchS, len(backing)) |
| for i := range backing { |
| backing[i].typ = int8(i) |
| ss[i] = moveLoadBenchS{h: moveLoadBenchHandle[moveLoadBenchBig]{&backing[i]}} |
| } |
| |
| b.ResetTimer() |
| var x int8 |
| for i := 0; i < b.N; i++ { |
| x += f(ss[i&(len(ss)-1)]) |
| } |
| moveLoadBenchSink = x |
| } |
| |
| func BenchmarkMoveLoadTypViaValue(b *testing.B) { |
| benchmarkMoveLoad(b, moveLoadBenchTypViaValue) |
| } |
| |
| func BenchmarkMoveLoadTypViaPtr(b *testing.B) { |
| benchmarkMoveLoad(b, moveLoadBenchTypViaPtr) |
| } |