Golang は、高い同時実行性と優れたパフォーマンスを開発するためのプログラミング言語であり、ゴルーチンやチャネルなどの言語レベルでの組み込みサポートを提供します。ただし、大規模なデータを処理する場合、Golang の上限 (容量) が需要を満たすことができず、プログラムのパフォーマンス上の問題が発生する可能性があります。この記事では、Golang の上限を拡張し、プログラムのパフォーマンスを最適化し、プログラムの実行を高速化する方法を紹介します。
まず、キャップとは何かを知る必要があります。 Golang では、スライスとマップの 2 つのデータ構造には、スライスまたはマップの基になる配列の容量を表す cap と呼ばれる属性があります。容量は、スライスまたはマップに事前に割り当てられている要素の数です。プログラムがスライスまたはマップに要素を追加するときに、スライスまたはマップの容量を超えると、基になる配列が拡張されます。拡張するとメモリの再割り当てとデータのコピーが発生するため、プログラムのパフォーマンスに影響します。
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) }
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 } }
Golang は効率的なプログラミング言語ですが、大規模なデータを処理する場合、上限がパフォーマンスのボトルネックになる可能性があります。上記の方法を使用してスライスとマップの上限を拡張し、プログラムのパフォーマンスを最適化できます。なお、拡張によりメモリの再割り当てやデータのコピーが発生するため、要素を追加する前に要素数と容量を見積もる必要があります。
以上がGolangでキャップを拡張する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。