Go1.15で整数をインターフェイス{}に変換する

Goラップトップの1.15リリースで、次のエントリが見つかりました

小さな整数値のインターフェースへの変換は、割り当てなしで行われるようになりました。
この短い投稿では、最適化とは何かを説明します。



Goでのインターフェイス{}のしくみ



この最適化がどのように機能するかを理解するには、Goのインターフェイス{}デバイスをブラッシュアップする必要があります。このトピックについてはあまり詳しく説明しません。主なアイデアを思い出してください。



インサイドはsrc /ランタイム/ runtime2.goこのような構造があります:



type iface struct {
	tab  *itab
	data unsafe.Pointer
}


これが私たちのインターフェースです。実際、インターフェイス{}は2つのポインタのみです。



  • data-ヒープ上でメモリが割り当てられたデータ自体へのポインタ
  • タブ-インターフェイスと基本タイプに関するメタ情報


得られた知識を視覚化し、次に進みます。







実際の問題は何ですか 



Goでは、ヒップに新しいオブジェクトを割り当てるのはコストがかかります。したがって、生産的なコードを記述したい場合は、間違いなくこの問題に直面します。したがって、一見しただけでも、マイナーな最適化によってアプリケーション全体のパフォーマンスを向上させることができます。



考慮された最適化が解決する問題は、小さな整数にオブジェクトを割り当てることは無駄な作業であるということです。



どのように解決されましたか



これがGoの人たちがしたことです。ランタイムパッケージには、0〜255の整数の静的配列がすでに含まれています。整数がインターフェイス{}に変換されるときに、この数値が指定された範囲内にあるかどうかがチェックされ、ある場合は、この配列の要素。これにより、不要な割り当てがなくなります。



あなたはgihabで変化を見ることができます



これらの種類の最適化は、Goでは新しいものではありません。したがって、1文字のascii文字列を作成する場合、メモリの割り当てはありません。同じシナリオでは、すべてが存在するわけではありません。Goランタイムには、1文字の文字列の静的配列が含まれています。ちなみに、現在は0から255までの値の静的配列が1つだけ実行時に存在するため、心配しないでください。文字列表現に再利用されます。



All Articles