ホームページ > バックエンド開発 > Golang > `rand.Float64()` を使用すると、同時実行により Go コードが遅くなるのはなぜですか?

`rand.Float64()` を使用すると、同時実行により Go コードが遅くなるのはなぜですか?

Linda Hamilton
リリース: 2024-12-12 12:03:15
オリジナル
1002 人が閲覧しました

Why Does Concurrency Slow Down My Go Code Using `rand.Float64()`?

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

提供されたコードは、ゲーム内のモンスターとの相互作用とアイテムドロップの可能性をシミュレートします。敗北時。コードは並列化に完全に適しているはずであるという期待にもかかわらず、同時実行性を追加すると大幅に速度が低下しました。

説明:

問題は rand.Float64( )、ミューテックス ロックを持つ共有グローバル オブジェクトに依存します。複数のゴルーチンがこの関数を同時に使用しようとすると、ロックの競合が発生し、パフォーマンスが妨げられます。

解決策:

この問題を解決するには、次の別のインスタンスを作成します。各ゴルーチンの Rand 構造体を作成し、そのインスタンスを使用して乱数を生成します。これにより、グローバル ロックの競合が排除され、真の並列化が可能になります。

更新されたコード:

func interaction(generator *rand.Rand) int {
    if generator.Float64() <= DROP_RATE {
        return 1
    }
    return 0
}

func simulation(n int, generator *rand.Rand) []int {
    interactions := make([]int, n)
    for i := range interactions {
        interactions[i] = interaction(generator)
    }
    return interactions
}
ログイン後にコピー

パフォーマンスの向上:

各ゴルーチンに新しい Rand インスタンスを作成する修正を適用した後、結果のコードは大幅な改善を示しますパフォーマンスで。 2 つのプロセッサを使用すると、シミュレーションの実行にかかる時間が約 75% 短縮されます。

結論:

Go で同時実行性を使用する場合は、共有グローバルに依存しないようにしてください。ランドインスタンス。代わりに、ゴルーチンごとに Rand 構造体のインスタンスを個別に作成して、最適なパフォーマンスを確保します。

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

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