ホームページ >バックエンド開発 >Golang >同時実行 Go コードがシーケンシャル コードよりも遅いのはなぜですか?

同時実行 Go コードがシーケンシャル コードよりも遅いのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-20 08:51:11563ブラウズ

Why is My Concurrent Go Code Slower Than Its Sequential Counterpart?

同時実行機能を追加すると、この Go コードが遅くなるのはなぜですか?

この質問では、既存の Go プログラムに同時実行機能を導入した場合の予期せぬパフォーマンスの低下について説明します。このコードは、ゲーム内のモンスターとの対話をシミュレートし、成功したアイテムのドロップを追跡します。効率を改善するために、プログラマは同時実行を使用して利用可能なプロセッサ間でワークロードを分割しようとしましたが、大幅な速度低下が発生しました。

元のコードとパフォーマンス

同時実行を使用しないと、プログラムは一連のシミュレーションを実行します。 (この例では 1,000)、各シミュレーションでは指定された数のインタラクション (この例では 1,000,000) が実行されます。次に、その結​​果を使用して、成功したインタラクションの合計数が計算されます。

同時実行性の変更

コードを並列化するために、プログラマは複数のゴルーチンを作成し、それぞれがシミュレーションの一部を実行します。これらは、ゴルーチンの数をプロセッサの数に合わせて、使用可能な CPU 間でワークロードを正しく分割します。

予期しない速度低下

驚くべきことに、パフォーマンスが向上する代わりに、同時コードの実行が 4 ~ 6 回行われました。

根本原因

問題同時ゴルーチンによってアクセスされる共有状態にあります。具体的には、 rand.Float64() 関数は、関連付けられたミューテックス ロックを持つ共有グローバル Rand インスタンスを使用します。複数のゴルーチンがグローバル Rand インスタンスにアクセスしようとすると、ミューテックス ロックを取得する必要があり、競合が発生してコードが遅くなります。

解決策

パフォーマンスの問題を解決するために、プログラマはゴルーチンごとに個別の Rand インスタンスを作成します。これにより、グローバル Rand インスタンスの競合がなくなり、ゴルーチンを独立して実行できるようになります。

パフォーマンスの向上

ゴルーチンごとに個別の Rand インスタンスを作成すると、パフォーマンスが大幅に向上します。同時実行コードは、デュアルコア CPU 上で非同時実行バージョンよりも約 2.5 倍高速に実行されます。

教訓

このシナリオは、共有リソースで使用される同期メカニズムを理解することの重要性を示しています。並行性を実装するとき。これは、データ アクセス パターンがパフォーマンスに与える影響と、プロセッサーの使用率と同期オーバーヘッドの間のトレードオフを考慮する必要性を強調しています。

以上が同時実行 Go コードがシーケンシャル コードよりも遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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