Go 言語の同時実行モデルのパフォーマンスはどのくらいですか?

王林
リリース: 2023-06-11 20:00:07
オリジナル
825 人が閲覧しました

近年、Go 言語の同時実行モデルは開発者の間でますます人気が高まっています。 Go で使用される Goroutine と Channel は、他の言語の同時実行モデルと比較して軽量で使いやすいです。では、実際のアプリケーションシナリオでは、Go言語の同時実行モデルはどのようなパフォーマンスを発揮するのでしょうか?

Go 言語の同時実行モデルは、Goroutine と Channel の設計概念を採用しており、同時操作の効率を向上させることを目的としています。 Goroutine は軽量のスレッドとみなすことができ、その起動コストと破棄コストは従来のスレッドよりもはるかに低くなります。チャネルは、データの送信を担当するゴルーチン間の通信の「パイプライン」とみなすことができます。ロック メカニズムと比較して、Channel はコルーチン間の同期と相互排他をより効率的に実現します。

同時タスクの量が少ないシナリオでは、Go の同時実行モデルのパフォーマンスは明らかではありません。ただし、Go の同時実行モデルは、大規模な並列コンピューティングや I/O 操作などのシナリオでは良好にパフォーマンスします。このようなシナリオでは、Go の同時実行モデルのパフォーマンスは、従来のマルチスレッド プログラムをも上回る可能性があります。

コンピューティング集約型アプリケーションを例として、Go 同時実行モデルと Python マルチスレッドのパフォーマンスを比較します。このアプリケーション シナリオでは、同時タスクの数が多く、計算強度が高く、計算要件が比較的高いことが予想されます。2 つの言語でテスト ケースを実装して、そのパフォーマンスを確認できます。

1 つ目は、Python マルチスレッドの実装です。

import threading

NUM_THREADS = 1000
NUM_STEPS = 1000000

def calculate_pi(start, end, step):
    pi = 0
    for i in range(start, end):
        x = (i + 0.5) * step
        pi += 4.0 / (1.0 + x * x)
    return pi

threads = []

for i in range(NUM_THREADS):
    start = int(i * NUM_STEPS / NUM_THREADS)
    end = int((i+1) * NUM_STEPS / NUM_THREADS)
    thread = threading.Thread(target=calculate_pi, args=(start, end, 1/NUM_STEPS))
    threads.append(thread)

for thread in threads:
    thread.start()

for thread in threads:
    thread.join()
ログイン後にコピー

ここでは Python マルチスレッドが使用され、計算のために 1000 個のスレッドが開かれます。テストの結果、プログラムの実行には約 71 秒かかることがわかりました。

次に、Go 同時実行モデルの実装方法を示します。

package main

import (
    "sync"
)

const (
    numThreads = 1000
    numSteps = 1000000
)

func calculatePi(start int, end int, step float64, wg *sync.WaitGroup, ch chan float64) {
    pi := 0.0
    for i := start; i < end; i++ {
        x := (float64(i) + 0.5) * step
        pi += 4.0 / (1.0 + x * x)
    }
    ch <- pi
    wg.Done()
}

func main() {
    wg := &sync.WaitGroup{}
    ch := make(chan float64, numThreads)

    for i := 0; i < numThreads; i++ {
        start := int(float64(i) * float64(numSteps) / float64(numThreads))
        end := int(float64(i+1) * float64(numSteps) / float64(numThreads))
        wg.Add(1)
        go calculatePi(start, end, 1.0/float64(numSteps), wg, ch)
    }

    wg.Wait()
    close(ch)

    pi := 0.0
    for result := range ch {
        pi += result
    }

    pi *= 1.0 / float64(numSteps)

    fmt.Println(pi)
}
ログイン後にコピー

テスト結果は、プログラムの実行時間が約 17 秒であることを示しています。 Python マルチスレッドと比較して、Go 同時実行モデルは大幅に効率的です。

もちろん、Go 言語の同時実行モデルにもいくつかの制限があります。たとえば、CPU を大量に使用するシナリオでは、Goroutine のコラボレーション メカニズムにより、GOMAXPROCS (つまり CPU コアの数) が十分に占有されず、プログラムのパフォーマンスに影響を与える可能性があります。ただし、一般的に言えば、大規模な並列コンピューティングや I/O 操作などのシナリオでは、Go 言語の同時実行モデルは非常に優れたパフォーマンスを発揮し、プログラムの効率とパフォーマンスを大幅に向上させることができます。

要約すると、実際のアプリケーション シナリオでの使用効果と開発者の操作の利便性を考慮すると、現時点では Go 同時実行モデルの方が優れていることは間違いありません。

以上がGo 言語の同時実行モデルのパフォーマンスはどのくらいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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