April 2022
Beginner to intermediate
464 pages
6h 44m
Japanese
Goで作成するプログラムは比較的高速に実行されます1。しかし、いくら高速でも無駄なロジックを何度も実行すればパフォーマンスは低下します。Goでパフォーマンスに差があらわれがちなポイントには、スライスとマップのメモリ確保があります。逆に言えば、マイクロベンチマークで差が出る領域はさまざまありますが、このメモリの確保以外の部分で大きくパフォーマンスに差が出るケースはまれです。そのため、Go開発者がパフォーマンス問題にあたると、まず調べるのがメモリ確保の頻度です。
本節では、スライスやマップのメモリ確保を高速化するためのトピックを紹介します。
C/C++、Rust、Javaよりは少し遅いけれど、プログラミング言語の中では比較的高速に実行されます。 https://greenlab.di.uminho.pt/wp-content/uploads/2017/09/paperSLE.pdf
Goはスライスを他言語の配列なみに多用し、Goの配列(固定長)を直接使う機会は多くありません。スライスは、その実態として固定長の配列が確保されており、スライスはそれを参照する窓として使われメモリの読み書きを行います。しかしメモリは一次元のアドレスにマッピングされますし、そのほかの変数も同じメモリ空間上に置かれているため、長さが足りないからといって好き勝手には拡張できません。裏の配列に要素を追加し続けて割り当てられたサイズを使い果たした場合、Goのランタイムは新しくメモリを確保し、そちらに配列の内容をコピーして移動します。スライスのappend()の裏では次のようなことが行われています。
Read now
Unlock full access