Go では、コンパイラは関数をインライン化することでコードの実行を最適化し、呼び出された関数のコードがコピーされて直接挿入されます。呼び出し側のコードに。これによりパフォーマンスは向上しますが、関数呼び出しのインライン化を明示的に防止する必要がある状況が生じる可能性もあります。
Inline pragma:
Go は、特定の関数のインライン化を無効にする //go:noinline プラグマを提供します。インライン実行を防ぐには、このディレクティブを関数宣言の直前に配置します。
//go:noinline func isPrime(p int) bool { // ... }
コンパイラ フラグ:
または、-gcflags を使用してすべてのインライン最適化を無効にすることもできます。 =-l コンパイラ フラグ。
go build -gcflags=-l primes.go
GCC の -O0 オプションは、インライン化を含むすべてのコードの最適化を無効にします。ただし、Go のインライン化の最適化はよりきめ細かく、どの関数をインライン化するかどうかを明示的に制御できます。
次のコード スニペットを考えてみましょう。素数の例:
if isPrime(p) { fmt.Println(p) } func isPrime(p int) bool { for i := 2; i < p; i += 1 { for j := 2; j < p; j += 1 { if i * j == p { return false } } } return true }
デフォルトでは、isPrime 関数は if にインライン化されます。ステートメントを実行すると、二重ループによりプログラムの速度が低下する可能性があります。 //go:noinline ディレクティブを isPrime 関数に追加すると、関数が直接呼び出されることになり、パフォーマンスが向上します。
以上がGo で関数のインライン化を明示的に制御するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。