ホームページ >バックエンド開発 >Golang >同時実行により Go ゲームのアイテム ドロップ シミュレーションが遅くなるのはなぜですか?それを修正するにはどうすればよいですか?

同時実行により Go ゲームのアイテム ドロップ シミュレーションが遅くなるのはなぜですか?それを修正するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-13 22:16:21645ブラウズ

Why Does Concurrency Slow Down My Go Game Item Drop Simulation, and How Can I Fix It?

同時実行機能を追加すると、ゲーム内アイテムのドロップをシミュレートする Go コードが遅くなるのはなぜですか?

この 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 サイトの他の関連記事を参照してください。

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