目次
質問内容
解決策
ホームページ バックエンド開発 Golang 「interface{}」をスライスに変換すると、余分なヒープ割り当てが発生するのはなぜですか?

「interface{}」をスライスに変換すると、余分なヒープ割り当てが発生するのはなぜですか?

Feb 12, 2024 pm 10:15 PM
暗黙的な変換

「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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Javaでshortを使用する方法 Javaでshortを使用する方法 May 07, 2024 am 03:33 AM

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

SQLでのifnullの使用法 SQLでのifnullの使用法 Apr 28, 2024 am 09:57 AM

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

Javaのcharとはどういう意味ですか? Javaのcharとはどういう意味ですか? May 01, 2024 pm 06:15 PM

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

C言語で割り算を計算する方法 C言語で割り算を計算する方法 Apr 13, 2024 pm 09:12 PM

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

mysql で * は何を意味しますか mysql で * は何を意味しますか Apr 26, 2024 am 07:21 AM

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

オラクルでの (+ の使用法) オラクルでの (+ の使用法) May 08, 2024 pm 08:12 PM

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

C++ 関数のオーバーロードの一致ルールは何ですか? C++ 関数のオーバーロードの一致ルールは何ですか? Apr 27, 2024 am 08:27 AM

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

暗黙的な型変換の一般的なアプリケーション シナリオを見てみましょう。 暗黙的な型変換の一般的なアプリケーション シナリオを見てみましょう。 Jan 11, 2024 pm 04:45 PM

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

See all articles