ホームページ >バックエンド開発 >Golang >Golangでキャップを拡張する方法

Golangでキャップを拡張する方法

WBOY
WBOYオリジナル
2023-05-10 18:22:37629ブラウズ

Golang は、高い同時実行性と優れたパフォーマンスを開発するためのプログラミング言語であり、ゴルーチンやチャネルなどの言語レベルでの組み込みサポートを提供します。ただし、大規模なデータを処理する場合、Golang の上限 (容量) が需要を満たすことができず、プログラムのパフォーマンス上の問題が発生する可能性があります。この記事では、Golang の上限を拡張し、プログラムのパフォーマンスを最適化し、プログラムの実行を高速化する方法を紹介します。

  1. キャップとは

まず、キャップとは何かを知る必要があります。 Golang では、スライスとマップの 2 つのデータ構造には、スライスまたはマップの基になる配列の容量を表す cap と呼ばれる属性があります。容量は、スライスまたはマップに事前に割り当てられている要素の数です。プログラムがスライスまたはマップに要素を追加するときに、スライスまたはマップの容量を超えると、基になる配列が拡張されます。拡張するとメモリの再割り当てとデータのコピーが発生するため、プログラムのパフォーマンスに影響します。

  1. スライスのキャップを拡張する

2.1. キャップの事前割り当て

スライスの作成時に、動的にではなく、より大きなキャップを事前に割り当てることができます。プログラムの実行中に容量を拡張します。これにより、展開の数が減り、プログラムのパフォーマンスが向上します。

arr := make([]int, 0, 1000)
// 从空slice开始,容量为1000

2.2. 手動拡張

スライスのキャップを手動で拡張することもできます。スライスに保存する必要がある要素の数がわかったら、まずスライスに小さいキャップを割り当て、必要に応じて拡張できます。

arr := make([]int, 0, 10)
// 先分配一个容量为10的底层数组
for i := 0; i < 1000; i++ {
    if len(arr) == cap(arr) { // 当容量不足时
        newCap := cap(arr) * 2 // 扩容为原来的2倍
        newArr := make([]int, len(arr), newCap)
        copy(newArr, arr)
        arr = newArr // 更换为新数组
    }
    arr = append(arr, i)
}
  1. 拡張マップキャップ

3.1. 要素数の見積もり

マップを作成するときにマップ要素の数を見積もります。これにより、基礎となるアレイの容量が大きくなり、拡張の数が減ります。

m := make(map[int]int, 1000)
// 预估map元素数量为1000

3.2. 容量を手動で調整する

マップの容量を手動で調整することもできます。マップ内に多数の要素がある場合、特定のルールに従ってマップの容量を増やすことができます。 Golang の標準ライブラリでは、マップの拡張ルールは次のとおりです。要素の数が基になる配列のサイズの 2/3 より大きい場合、マップは元のサイズの 2 倍に拡張されます。

m := make(map[string]int) // 创建空map
for i := 0; i < 10000; i++ {
    key := fmt.Sprintf("key%d", i)
    m[key] = i
    if len(m) >= int(0.67 * float64(cap(m))) { // 当元素数量超过2/3时
        newCap := cap(m) * 2 // 扩容为原来的2倍
        newMap := make(map[string]int, newCap)
        for k, v := range m {
            newMap[k] = v // 复制元素到新map
        }
        m = newMap //更换为新map
    }
}
  1. 概要

Golang は効率的なプログラミング言語ですが、大規模なデータを処理する場合、上限がパフォーマンスのボトルネックになる可能性があります。上記の方法を使用してスライスとマップの上限を拡張し、プログラムのパフォーマンスを最適化できます。なお、拡張によりメモリの再割り当てやデータのコピーが発生するため、要素を追加する前に要素数と容量を見積もる必要があります。

以上がGolangでキャップを拡張する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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