ホームページ >バックエンド開発 >Golang >同時実行性を追加すると Go コードが遅くなるのはなぜですか?

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

DDD
DDDオリジナル
2024-12-11 11:10:13412ブラウズ

Why Did Adding Concurrency Slow Down My Go Code?

同時実行により Golang コードが遅くなる

モンスターやアイテムドロップとのインタラクションをシミュレートするコードを最適化する目的で同時実行が導入され、驚くほどパフォーマンスに影響を与えました。

同時実行性のない元のコードには、主に 3 つのコードがありました。機能: インタラクション、シミュレーション、テスト。インタラクションは単一のインタラクションをシミュレートし、アイテムドロップの場合は 1 を返し、それ以外の場合は 0 を返します。シミュレーションは複数のインタラクションを実行し、結果をスライスに保存しました。テストは一連のシミュレーションを実行し、成功したインタラクションの合計数をスライスに保存しました。

同時実行性が追加されると、テストごとにゴルーチンが作成され、各ゴルーチンがシミュレーションの独自のコピーで実行されます。ただし、パフォーマンスは向上するどころか悪化しました。

速度低下の理由

問題は、Mutex を持つ共有グローバル オブジェクトを使用する rand.Float64() 関数にありました。ロック。デフォルトでは、各ゴルーチンは rand.Float64() を呼び出すときにこの Mutex ロックを取得し、最終的にパフォーマンスが低下します。

解決策

これを修正するには、個別の rand を使用します。 New() インスタンスは CPU ごとに作成されました。これにより、共有ミューテックス ロックの問題が解消され、パフォーマンスが大幅に向上しました。

追加の改善

rand.Float64() 便利な関数を direct 関数に置き換えることで、さらなるパフォーマンスの向上が達成されました。 Rand 構造体を呼び出します。コンビニエンス関数はグローバルなミューテックスで保護された Rand インスタンスを使用しますが、直接呼び出しはこのオーバーヘッドを回避します。

結論

同時実行により特定の問題のパフォーマンスが向上する可能性がありますが、適切な実装が必要です。重要です。この場合、個別の rand.New() インスタンスを使用し、共有 Mutex ロックを回避することが、パフォーマンスの低下を最小限に抑える鍵となりました。

以上が同時実行性を追加すると Go コードが遅くなるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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