golang/go の master ブランチに行われたコミットから個人的に気になったものをリストにしたものです。
前回作成したリストはこちら。
軽く説明を追加していますが勘違いや誤りがあるかもしれません。
Topic
- BoringCrypto を使うための
dev.boringcrypto
ブランチが master にマージされました。 - 環境変数
GOMEMLIMIT
でメモリ使用量のソフトリミットを設定できるようになりました。 - 標準パッケージにジェネリクスが導入されました。
Commits
2022-05-02
ファイルディスクリプタに対する書き込み処理にて内部で保持している使用済みバッファが GC に回収されやすくなるように修正されています。
Go 1.17 で net.Buffers
に入っていたのと同様の処理を適用したようです。 1
2022-05-03
BoringCrypto を使うための dev.boringcrypto
ブランチが master にマージされました。
デフォルトでは無効化されていますがビルドタグで boringcrypto
を指定すると有効になるようです。 2
for range ループでスライスをゼロクリアする際に Go コンパイラはランタイム関数 memclrNoHeapPointers()
を使用して最適化しますが、 range にスライスのポインタを渡した場合に最適化が実行されない問題が修正されています。 3
2022-05-04
GC による CPU 使用率が 50%を超えないようにするリミッターが追加されました。
環境変数 GOMEMLIMIT
でメモリ使用量のソフトリミットを設定できるようになりました。 4
ソフトリミットは runtime/debug.SetMemoryLimit()
でも設定できるようです。
また、 GC アルゴリズムもソフトリミットを考慮した形に修正されています。
大量の goroutine が動いている環境で goroutine profile を取得するとレイテンシースパイクが発生する問題が改善されています。 5
取得に要する時間は増加してしまいますが STW を減らしたようです。
メモリ管理のための領域に対するロックを分割することで GC での STW を減らすための修正です。 6
2022-05-05
sync/atomic
に型付きの値が追加されました。 7
Bool
, Int32
, Int64
, Uint32
, Uint64
, Uintptr
のほかにジェネリクスを使用した任意の型のポインタ Pointer[T any]
が追加されています。
標準パッケージに対するジェネリクス追加はこれが初めてではないかと思います。
io.LimitedReader
に Err フィールドが追加されました。 8
従来は制限値に到達した際に返すエラーは io.EOF
固定でしたがこの変更により呼び出し元で任意のエラーを指定できるようになりました。
ただし、この変更については実際のデータ量と制限値が同じだった場合に io.EOF
以外のエラーを返す動作が議論の対象となり revert されました。
2022-05-07
TLS コネクション確立時の Handshake で行われるメモリ割り当て回数を削減しています。
2022-05-10
riscv64 でレジスタベースの関数呼び出し規約がデフォルトで有効になりました。
amd64, arm64, ppc64 に続くアーキテクチャになります。
連続したメモリをゼロクリアするためのランタイム関数 memclrNoHeapPointers()
が最適化されています。
ERMSB が利用可能かつサイズ大きい場合は AVX2 より速いようです。
2022-05-17
time.Time
に ZoneBounds()
というメソッドが追加されています。 9
夏時間などの移行タイミングを想定しているらしくタイムゾーンの開始・終了時刻を取得できるようです。
2022-05-18
ステータスコード 1xx に対応するための修正です。
http.ResponseWriter
の WriteHeader()
は複数回の呼び出しが認められていませんでしたが 100 から 199 のステータスについてはカウントされなくなったうえに書き込み中のバッファが flush されるようになりました。 10 11 12
バイトスライスに文字列を追加するための Append()
, Appendf()
, Appendln()
が fmt
パッケージに追加されています。 13
2022-05-19
新しいアーキテクチャ linux/loong64 への移植が完了しました。 14
雑感
引き続き多数の改善が行われています。
その一方で Go 1.19 ベータが近づいておりリリースノート周りの修正も目立つようになってきました。