こんにちは、ホリネズミたち! Golang を使い始めた最初の 1 年間、私はフィールドの順序付けがあるに違いないと考え続けましたが、なぜそれを気にする必要があるのかと考えていました。まあ、それは単なるフィールドです、何かが間違っているだけですよね?他のほとんどの初心者と同じように、私もそれを気にする価値はないと考えていました。言い換えれば、構造体の特定のフィールドが特定の順序で配置されることがどれほど重要でしょうか?そうですね、とてもお得です!
フィールドの順序付けは、最初は無視される側面の 1 つですが、チュートリアルを進めるにつれて、特に Go がポインターをどのように扱うかについての理解が非常に重要であることが理解されます。実際、アプリケーションのパフォーマンスを向上させる場合、特に大規模なデータ セットやメモリに負荷がかかりすぎる操作を扱う場合、まさにこの順序が重要です。この残念な欠陥は、なぜそれが Go フィールドの順序付けでそれほど重要なのかをよりよく理解することで修正されるでしょう。
構造体をメモリに配置すると、構造体は連続したメモリのブロックとして表され、すべてのフィールドが構造体の定義に従って順番に配置されます。これはかなり単純に思えるかもしれませんが、この種の線形構成は、特にメモリのアライメントやパディングなどの領域で、非常に重要な効果も果たします。
メモリ アライメントとは、データがメモリにどのように配置され、メモリにアクセスされるかに関するものです。通常、CPUS は、メモリ内のデータがフェッチされる場所に関して偏りを持つ可能性があり、これはアライメント境界と呼ばれます。たとえば、32 ビット整数は 4 バイト目のアドレスに配置またはフェッチする必要があります。構造体に適切に配置されていないフィールドがある場合、ページをめくると、Go コンパイラーがパディング バイトなどを追加することがあります。これはかなり無駄になります。たとえば、この構造体を見てください。
struct example{ a bool // 1 byte b int32 // 4bytes; c bool // 1byte d int64 //8 bytes }
この不適切な構造体では、アライメント ルールにより、Go コンパイラが次のフィールドの中央に 1 つ以上のパディング バイトを追加する可能性があります:
a は 1 バイトですが、b は 4 バイトの位置合わせを必要とするため、パディングが 3 バイト挿入されます
b の長さは 4 バイトです
c の長さは 1 バイトですが、8 バイトを必要とする d を整列させるために 7asing があるため、パディングが導入されます。
d の長さは 8 バイトです
木材は構造用木材であり、脚のせいでサイズは 24 ですが、内容物には 14 しかかかりませんが、実際の内容物と詰め物の量を合わせたボリュームを見てください。 .
フィールドの順序と構造の検索は、負のマージンの形でスペースを無駄にすることを避けるのに役立ちます。言い換えると:
type Example struct { d int64 // 8 bytes b int32 // 4 bytes a bool // 1 byte c bool // 1 byte }
上記の最適化された構造体:
d は 8 バイトを占めます。
b は 4 バイトを占めます.
a と c は、パディングを必要とせずに、それぞれ 1 バイトを占有します。
この構造のサイズは現在わずか 16 バイトですが、以前の 24 バイトサイズの構造よりも優れています。
一般的な小規模アプリケーションを検討すると、アプリケーションが使用するメモリの量が後者と変わらないことがわかるでしょう。ただし、これは、システムに組み込まれた超高速高頻度取引アプリケーション、またはこれらの忠実な制限が急速に蓄積される可能性のある膨大な量のデータを処理することを目的としたアプリケーションを考慮すると、パフォーマンスとさらにはメモリ領域が重要である構築では当てはまりません。これは、多くの大きな配列や構造体の連結されたスライスを使用して構築または操作する場合にさらに明らかになります。構造体の容量がわずか数バイト大きい場合、バイアスや負荷結合に気づくのはそれほど簡単ではありません。低メモリ アーキテクチャが大量生産され、数百万ものインスタンスが少しずつ処理されるようになると、このような無駄の過剰摂取は前代未聞ではなくなります。
フィールドの順序付けは、Golang 構造体設計の観点から優れているだけでなく、メモリの最適化においても重要な役割を果たします。 Go が構造体とそのピクセルのメモリ レイアウトを行う方法のこの側面を理解すると、実際により効果的な構造体設計が可能になります。メモリを頻繁に使用するアプリケーションが関係する場合、このような重要ではない調整により、パフォーマンスが大幅に向上する可能性があります。次に Go で構造体を定義する機会が来たときは、それらのフィールドをそのままばら撒いてはいけません。代わりに、1 分かけて順序を検討してください。数日後、自分自身とそのアプリケーションに感謝することになるでしょう!
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3