ホームページ >バックエンド開発 >Golang >Go スライス: ディープ コピーの追加とコピー – どちらが効率的ですか?

Go スライス: ディープ コピーの追加とコピー – どちらが効率的ですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-10 21:00:15595ブラウズ

Go Slices:  Append vs. Copy for Deep Copying – Which is More Efficient?

スライスの効率的なディープ コピー

Go では、スライスのディープ コピーを作成するには、その内容を別のメモリ場所に複製する必要があります。これにより、1 つのスライスに加えられた変更が他のスライスに影響を与えないことが保証されます。

ディープ コピーの 1 つのアプローチは、append 関数を使用することです。

copy := append([]T{}, orig...)

ここでは、元のスライスのオリジナルが追加されます。空のスライス。独自のバッキング配列を持つ新しいスライス コピーを作成します。

別の方法では、組み込みのコピーを使用します。 function:

cpy := make([]T, len(orig))
copy(cpy, orig)

このアプローチは、orig から新しく作成されたスライス cpy に要素を直接コピーします。

どちらのソリューションも、スライス内の値を効果的にコピーします。ただし、スライスにポインタまたはポインタ フィールドを持つ構造体が含まれている場合、これらのポインタ値は元のスライスと同じ場所を参照することに注意することが重要です。

2 つの方法のベンチマークを行うと、同等のパフォーマンスが得られます。

BenchmarkCopy     100000         24724 ns/op
BenchmarkAppend   100000         24967 ns/op

アセンブリ コードは、追加とコピーの両方が、その一部としてメモリのゼロフィルを実行する可能性があることを示しています。

最終的に、追加方法とコピー方法のどちらを選択するかは、個人の設定とパフォーマンスの考慮事項によって決まります。ただし、どちらのアプローチも効果的にスライスをディープ コピーし、スライス データの個別のインスタンスを操作するときにデータの整合性を確保します。

以上がGo スライス: ディープ コピーの追加とコピー – どちらが効率的ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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