この Go コードでは、test() 関数が複数のシミュレーションを並行して実行します。ただし、同時実行性を追加するとプログラムの速度が低下します。
問題は、シミュレーションが乱数生成器とどのように対話するかにあります。デフォルトでは、Go rand パッケージは、ミューテックス ロックで保護された Rand 型のグローバル インスタンスを使用します。便利な関数 rand.Float64() を使用する場合、各 goroutine はこのロックを取得する必要があり、プログラムの速度を低下させるボトルネックが発生します。
コードを並列化するには事実上、ゴルーチンごとに Rand 型の個別のインスタンスを作成します。これにより、ミューテックス ロックの必要性がなくなり、ゴルーチンが独立して動作できるようになります。
コード例:
// Create a new Rand instance for each goroutine source := rand.NewSource(time.Now().UnixNano()) generator := rand.New(source)
使用法:
ジェネレータ インスタンスを interaction() や Simulation() などの関数に渡して、ミューテックス ロックなしで乱数を生成します
result := interaction(generator)
ミューテックス ロックの問題に対処することで、コードは同時実行性を最大限に活用してシミュレーションを高速化できるようになりました。
以上が同時実行により Go ゲームのアイテム ドロップ シミュレーションが遅くなるのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。