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 < 100000000; i = i + 1 { C.show() } end_time := time.Now() var dur_time time.Duration = end_time.Sub(now) var elapsed_min float64 = dur_time.Minutes() var elapsed_sec float64 = dur_time.Seconds() var elapsed_nano int64 = dur_time.Nanoseconds() fmt.Printf("cgo show function elasped %f minutes or \nelapsed %f seconds or \nelapsed %d nanoseconds\n", elapsed_min, elapsed_sec, elapsed_nano) now = time.Now() for i := 0; i < 100000000; i = i + 1 { show() } end_time = time.Now() dur_time = end_time.Sub(now) elapsed_min = dur_time.Minutes() elapsed_sec = dur_time.Seconds() elapsed_nano = dur_time.Nanoseconds() fmt.Printf("go show function elasped %f minutes or \nelapsed %f seconds or \nelapsed %d nanoseconds\n", elapsed_min, elapsed_sec, elapsed_nano) var input string fmt.Scanln(&input) }
テスト コードから得られた結果は、C 関数の呼び出しが Go 関数よりも著しく遅いことを示しました。これにより、テスト コード自体に欠陥があるかどうかという疑問が生じました。
提供されたテスト コードは有効ですが、Cgo に固有のパフォーマンス制限が原因で問題が発生します。 Cgo 関数で観察された実行時間の遅さ。
Cgo を介して C/C コードを呼び出すと、比較的高いオーバーヘッドが発生し、これらを最小限に抑えます。通常は CGo 呼び出しが推奨されます。この特定のシナリオでは、Go から CGo 関数を繰り返し呼び出すのではなく、ループを C に移動すると、パフォーマンスが向上する可能性があります。
さらに、CGo は C コードを実行するために別のスレッド設定を採用しており、コードについて特定の前提を置いています。行動。これらの前提条件の一部はパフォーマンスに影響を与える可能性があります:
CGo の役割は次のとおりです。主に、既存のライブラリとインターフェースするためのゲートウェイとして見なされ、潜在的に Go からの呼び出しの数を減らすために追加の小さな C ラッパー関数が使用されます。 CGo による C のようなパフォーマンスの最適化の期待は、一般に満たされません。同等の C と Go コード間のパフォーマンスのギャップはすでに小さくなっているからです。
以上が私の Cgo 関数は、同等の Go 関数よりもはるかに遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。