ホームページ >バックエンド開発 >Golang >私の Cgo 関数は、同等の Go 関数よりもはるかに遅いのはなぜですか?

私の Cgo 関数は、同等の Go 関数よりもはるかに遅いのはなぜですか?

DDD
DDDオリジナル
2024-12-04 01:27:09868ブラウズ

Why Is My Cgo Function So Much Slower Than My Equivalent Go Function?

Cgo のパフォーマンスが当惑するほど遅い理由: テスト ケースの調査

Cgo 関数と純粋な Go 関数の実行時間を繰り返し比較しようとしたところ、テスターは予期しない結果に遭遇しました。 。 Cgo 関数は Golang 関数よりも大幅に時間がかかり、混乱とテスト コードの探索につながりました。

問題のテスト コード

以下の提供されたテスト コードは、Cgo の実行時間を比較しています。および純粋な Go 関数 (それぞれ 1 億回実行):

import (
    "fmt"
    "time"
)

/*
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void show() {

}

*/
// #cgo LDFLAGS: -lstdc++
import "C"

//import "fmt"

func show() {

}

func main() {
    now := time.Now()
    for i := 0; i <h3>予期しない結果とシーク回答</h3>
<p>テスト コードから得られた結果は、C 関数の呼び出しが Go 関数よりも著しく遅いことを示しました。これにより、テスト コード自体に欠陥があるかどうかという疑問が生じました。</p>
<h3>Cgo のパフォーマンス課題への取り組み</h3>
<p>提供されたテスト コードは有効ですが、Cgo に固有のパフォーマンス制限が原因で問題が発生します。 Cgo 関数で観察された実行時間の遅さ。</p>
<p>Cgo を介して C/C コードを呼び出すと、比較的高いオーバーヘッドが発生し、これらを最小限に抑えます。通常は CGo 呼び出しが推奨されます。この特定のシナリオでは、Go から CGo 関数を繰り返し呼び出すのではなく、ループを C に移動すると、パフォーマンスが向上する可能性があります。</p>
<p>さらに、CGo は C コードを実行するために別のスレッド設定を採用しており、コードについて特定の前提を置いています。行動。これらの前提条件の一部はパフォーマンスに影響を与える可能性があります:</p>
<ul>
<li>Go のゴルーチンは比較的小さなスタックを利用し、スタックの増加を動的に処理します。</li>
<li>CGo のスレッド処理は、libpthread のスレッド ローカル ストレージ実装に干渉する可能性があります。 </li>
<li>Go の UNIX シグナル ハンドラーは従来の C または C を混乱させる可能性がありますコード。</li>
<li>C コードがシステム コールのブロックやスレッドの独占に関与している場合、複数の Goroutine で OS スレッドを再利用すると、悪影響が生じる可能性があります。</li>
</ul>
<h3>結論</h3>
<p>CGo の役割は次のとおりです。主に、既存のライブラリとインターフェースするためのゲートウェイとして見なされ、潜在的に Go からの呼び出しの数を減らすために追加の小さな C ラッパー関数が使用されます。 CGo による C のようなパフォーマンスの最適化の期待は、一般に満たされません。同等の C と Go コード間のパフォーマンスのギャップはすでに小さくなっているからです。</p></string.h></stdlib.h></stdio.h>

以上が私の Cgo 関数は、同等の Go 関数よりもはるかに遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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