以前:
- hymkor/go-minimal-optional: The minimal
optional
package for golang - Go言語で必要最小限の optional パッケージを実装したものの、安全性と使い勝手の両立は難しい - 標準愚痴出力
というパッケージを作ったが、別の方式で、もう一つ作ってみた。
README にだいたい書いてあるけれども、go-minimal-optional では
type Value[T any] []T
と表現していた構造を
type Value[T any] struct { value T ok bool }
という安直な形で再実装してみた。メモリアローケーションが改善されるのではないかと期待してのことだが… 結果は
go-minimal-optional
BenchmarkIfSome-4 656701584 1.790 ns/op 0 B/op 0 allocs/op BenchmarkIfNone-4 1000000000 0.7019 ns/op 0 B/op 0 allocs/op
go-tiny-optional
BenchmarkIfSome-4 675800485 1.787 ns/op 0 B/op 0 allocs/op BenchmarkIfNone-4 1000000000 0.7008 ns/op 0 B/op 0 allocs/op
ほんの少しだけ速いけど、微粒子レベルの差にすぎず、あまり変わりませんねぇ。それよりも、allocation 回数がどっちでもゼロだったのに驚いた。Go の最適化がうまいこと効いていたみたい。
まぁ、これくらいなら、1.22 でなくとも「rangefunc もどき」が使える go-minimal-optional でいいかもしれませんねぇ。