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

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

Mary-Kate Olsen
リリース: 2024-12-13 22:16:21
オリジナル
643 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート