「interface{}」をスライスに変換すると、余分なヒープ割り当てが発生するのはなぜですか?
PHP では、「interface{}」タイプをスライスタイプに変換すると、追加のヒープ割り当てが発生します。これは、PHP ではインターフェイスが抽象データ型であり、スライスが動的配列型であるためです。インターフェイス型をスライス型に変換すると、PHP はスライスの要素を保存するためにスライス型に追加のメモリ領域を割り当てる必要があります。この追加のヒープ割り当て操作により追加のメモリ オーバーヘッドが発生し、メモリに依存する一部のアプリケーションでパフォーマンスの問題が発生する可能性があります。したがって、型変換を実行するときは、この問題に注意し、不必要な追加のヒープ割り当てを避けるように努める必要があります。
質問内容
func benchmarkpool(b *testing.b) { b.reportallocs() p := sync.pool{new: func() interface{} { return make([]byte, 1024) }} for i := 0; i < b.n; i++ { bts := p.get().([]byte) p.put(bts) } }
このベンチマークでは、go1.19.5 で次の出力が得られます。
リーリー[]byte
:
interface{}
をスライスに変換し直すと、追加のヒープ割り当てが発生するようです。
なぜ go にはこのような追加の割り当てが必要なのでしょうか?この背後にある設計上の考慮事項は何ですか?
解決策
割り当ての原因は、any
から []byte
への変換ではなく、[]byte の変換です。
から any
への変換。 p.Put(bts)
パラメータ bts
を (*sync.Pool).Put
に渡す前に暗黙的に any
に変換します。 GoGC 1.19 のインターフェイスは、1 組のポインターとして実装され、1 つは型メタデータを指し、もう 1 つは実際のオブジェクトを指します。この場合、2 番目のポインターはプールにエスケープされ、スライス オブジェクトが割り当てられます。これはスライス型だけでなく、他の非ポインター型にも当てはまります。
*[]byte
などのポインターの場合、コンパイラはその値を iface
構造体に直接配置する最適化を実行するため、変換時に が削除されます。 *[]byte
インスタンスの割り当て。したがって、一般的には、構造体自体ではなくプールにポインターを入れることをお勧めします。
以上が「interface{}」をスライスに変換すると、余分なヒープ割り当てが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









short は、-32,768 ~ 32,767 の範囲の 16 ビット符号付き整数を表す Java のプリミティブ データ型です。これは、カウンタや ID などの小さな整数を表すためによく使用され、基本的な算術演算と型変換をサポートします。ただし、short は符号付き型であるため、除算を使用する場合はオーバーフローやアンダーフローを避けるために注意する必要があります。

IFNULL 関数は、式が NULL かどうかをチェックし、NULL である場合は指定されたデフォルト値を返し、そうでない場合は式の値を返します。これにより、Null 値によるエラーの発生が防止され、Null 値の操作が可能になり、クエリの可読性が向上します。使用法には、NULL 値をデフォルト値に置き換える、計算から NULL 値を除外する、および複数の NULL 値の状況を処理するためのネストされた使用法が含まれます。

Java の char 型は、U+0000 から U+FFFF までの 2 バイトを占める単一の Unicode 文字を格納するために使用されます。これは、一重引用符または Unicode エスケープ シーケンスを通じて初期化できます。比較、等価、不等式、結合演算に参加でき、暗黙的に int 型に変換することも、明示的に Character オブジェクトに変換することもできます。

C 言語では、除算演算子 / の動作はオペランドのデータ型によって異なります。 整数除算: オペランドが整数の場合、整数除算が実行され、結果は切り捨てられます。浮動小数点除算: オペランドが浮動小数点数の場合、浮動小数点除算が実行され、結果は浮動小数点数になります。型変換: 一方のオペランドが整数で、もう一方のオペランドが整数でない場合、整数は暗黙的に浮動小数点数に変換され、浮動小数点除算が実行されます。 0 による除数: 除数が 0 の場合、数学的エラーが発生します。モジュロ演算: モジュロ演算には、モジュロ除算ではなく % 演算子を使用します。

MySQL のアスタリスク (*) は「すべて」を意味し、さまざまな用途があります。 すべての列を選択 すべての行を選択 テーブルの JOIN ワイルドカード LIKE 句 REGEXP 句の量子子の暗黙的な型変換

Oracle のプラス (+) 演算子は、文字列、数値、日付、および時間間隔を接続する、NULL 値を処理する、および NULL を非 NULL 値に変換する、データ型を文字列型に変換するために使用できます。

C++ 関数のオーバーロードの一致ルールは次のとおりです。呼び出し内のパラメータの数と型を一致させます。パラメータの順序は一貫している必要があります。 constness 修飾子と参照修飾子は一致する必要があります。デフォルトのパラメータを使用できます。

暗黙的な型変換の一般的なアプリケーション シナリオを見てみましょう。はじめに: プログラミング言語では、暗黙的な型変換は自動的に実行されるデータ型変換プロセスです。一部のプログラミング言語では、この変換は、コンパイラまたはインタプリタに変換を実行するように明示的に指示する必要がなく、暗黙的に実行されます。暗黙的な型変換には、プログラミングにおける幅広い応用シナリオがあります。この記事では、一般的な応用シナリオのいくつかについて説明します。数値計算における暗黙的な型変換 数値計算では、異なる型のデータ間の演算が必要になることがよくあります。データの種類が異なる場合
