6 simple ways to optimise Golang を読む
名前付き戻り値を使うとパフォーマンスが改善する
named return か否かで生成されるコードが変わるらしい。
同じコードを生成するようにしようという issue が 5 年くらい前からあるが、 open のまま。
もしかしたら改善されている部分もあるのかもしれない。
文字列の結合には strings.Builder を使え
+
や fmt.Sprintf よりも strings.Builder のほうがパフォーマンス的に良いらしい
確かにパフォーマンス的に良さそうな事が書いてある
A Builder is used to efficiently build a string using Write methods. It minimizes memory copying
non-zero な Builder をコピーするなとも書いてある
The zero value is ready to use. Do not copy a non-zero Builder
記事中のコードをよく見ると sb.String() がベンチマークの外で呼ばれているので、ベンチマークとしてはあまり適切ではなさそう。
log.Printf("joinStrWithBuilderForLoop ExecTime is %22s %6s\n", "->", time.Since(execTime))
return sb.String()
話がずれるが、 fmt.Sprintf が +
よりもパフォーマンスが良いというのは意外だった。てっきり +
のほうがいいのかと思いこんでいた。 fmt.Sprintf を避けて +
を使ったりしていたが、むしろ fmt.Sprintf を使ったほうがいいのかもしれない。
for range の代わりに for loop を使え
for range は要素の構造体のフィールド数が増えるとパフォーマンスが悪化するが、 for loop では要素の型が変わってもパフォーマンスはほとんど変わらない。
この件に関連する日本語のソースなどはぱっと見つからない。
下記の記事では、 for range のほうが最適化が効いて速くなるみたいなことが書いてある気がするが、
ちょっとまだちゃんと読めていない。
ちなみに、この連載に関して最初に思ったこととして、
パフォーマンスについて語るのであれば、一回実行しただけの処理時間を比較するのではなく、
testing.B を使って Benchmark Test をすべきだと思う。
以前 aqua で benchmark test をした際のコード
と思ったら、以下の記事では Benchmark Test をしていた。