この質問では、既存の Go プログラムに同時実行機能を導入した場合の予期せぬパフォーマンスの低下について説明します。このコードは、ゲーム内のモンスターとの対話をシミュレートし、成功したアイテムのドロップを追跡します。効率を改善するために、プログラマは同時実行を使用して利用可能なプロセッサ間でワークロードを分割しようとしましたが、大幅な速度低下が発生しました。
同時実行を使用しないと、プログラムは一連のシミュレーションを実行します。 (この例では 1,000)、各シミュレーションでは指定された数のインタラクション (この例では 1,000,000) が実行されます。次に、その結果を使用して、成功したインタラクションの合計数が計算されます。
コードを並列化するために、プログラマは複数のゴルーチンを作成し、それぞれがシミュレーションの一部を実行します。これらは、ゴルーチンの数をプロセッサの数に合わせて、使用可能な CPU 間でワークロードを正しく分割します。
驚くべきことに、パフォーマンスが向上する代わりに、同時コードの実行が 4 ~ 6 回行われました。
問題同時ゴルーチンによってアクセスされる共有状態にあります。具体的には、 rand.Float64() 関数は、関連付けられたミューテックス ロックを持つ共有グローバル Rand インスタンスを使用します。複数のゴルーチンがグローバル Rand インスタンスにアクセスしようとすると、ミューテックス ロックを取得する必要があり、競合が発生してコードが遅くなります。
パフォーマンスの問題を解決するために、プログラマはゴルーチンごとに個別の Rand インスタンスを作成します。これにより、グローバル Rand インスタンスの競合がなくなり、ゴルーチンを独立して実行できるようになります。
ゴルーチンごとに個別の Rand インスタンスを作成すると、パフォーマンスが大幅に向上します。同時実行コードは、デュアルコア CPU 上で非同時実行バージョンよりも約 2.5 倍高速に実行されます。
このシナリオは、共有リソースで使用される同期メカニズムを理解することの重要性を示しています。並行性を実装するとき。これは、データ アクセス パターンがパフォーマンスに与える影響と、プロセッサーの使用率と同期オーバーヘッドの間のトレードオフを考慮する必要性を強調しています。
以上が同時実行 Go コードがシーケンシャル コードよりも遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。