同時実行性を追加すると、この Go コードが遅くなるのはなぜですか?
提供されたコードは、ゲーム内のモンスターとの相互作用とアイテムドロップの可能性をシミュレートします。敗北時。コードは並列化に完全に適しているはずであるという期待にもかかわらず、同時実行性を追加すると大幅に速度が低下しました。
説明:
問題は rand.Float64( )、ミューテックス ロックを持つ共有グローバル オブジェクトに依存します。複数のゴルーチンがこの関数を同時に使用しようとすると、ロックの競合が発生し、パフォーマンスが妨げられます。
解決策:
この問題を解決するには、次の別のインスタンスを作成します。各ゴルーチンの Rand 構造体を作成し、そのインスタンスを使用して乱数を生成します。これにより、グローバル ロックの競合が排除され、真の並列化が可能になります。
更新されたコード:
func interaction(generator *rand.Rand) int { if generator.Float64() <= DROP_RATE { return 1 } return 0 } func simulation(n int, generator *rand.Rand) []int { interactions := make([]int, n) for i := range interactions { interactions[i] = interaction(generator) } return interactions }
パフォーマンスの向上:
各ゴルーチンに新しい Rand インスタンスを作成する修正を適用した後、結果のコードは大幅な改善を示しますパフォーマンスで。 2 つのプロセッサを使用すると、シミュレーションの実行にかかる時間が約 75% 短縮されます。
結論:
Go で同時実行性を使用する場合は、共有グローバルに依存しないようにしてください。ランドインスタンス。代わりに、ゴルーチンごとに Rand 構造体のインスタンスを個別に作成して、最適なパフォーマンスを確保します。
以上が`rand.Float64()` を使用すると、同時実行により Go コードが遅くなるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。