同時実行により Golang コードが遅くなる
モンスターやアイテムドロップとのインタラクションをシミュレートするコードを最適化する目的で同時実行が導入され、驚くほどパフォーマンスに影響を与えました。
同時実行性のない元のコードには、主に 3 つのコードがありました。機能: インタラクション、シミュレーション、テスト。インタラクションは単一のインタラクションをシミュレートし、アイテムドロップの場合は 1 を返し、それ以外の場合は 0 を返します。シミュレーションは複数のインタラクションを実行し、結果をスライスに保存しました。テストは一連のシミュレーションを実行し、成功したインタラクションの合計数をスライスに保存しました。
同時実行性が追加されると、テストごとにゴルーチンが作成され、各ゴルーチンがシミュレーションの独自のコピーで実行されます。ただし、パフォーマンスは向上するどころか悪化しました。
速度低下の理由
問題は、Mutex を持つ共有グローバル オブジェクトを使用する rand.Float64() 関数にありました。ロック。デフォルトでは、各ゴルーチンは rand.Float64() を呼び出すときにこの Mutex ロックを取得し、最終的にパフォーマンスが低下します。
解決策
これを修正するには、個別の rand を使用します。 New() インスタンスは CPU ごとに作成されました。これにより、共有ミューテックス ロックの問題が解消され、パフォーマンスが大幅に向上しました。
追加の改善
rand.Float64() 便利な関数を direct 関数に置き換えることで、さらなるパフォーマンスの向上が達成されました。 Rand 構造体を呼び出します。コンビニエンス関数はグローバルなミューテックスで保護された Rand インスタンスを使用しますが、直接呼び出しはこのオーバーヘッドを回避します。
結論
同時実行により特定の問題のパフォーマンスが向上する可能性がありますが、適切な実装が必要です。重要です。この場合、個別の rand.New() インスタンスを使用し、共有 Mutex ロックを回避することが、パフォーマンスの低下を最小限に抑える鍵となりました。
以上が同時実行性を追加すると Go コードが遅くなるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。