2016-09-04 12 views
-1

この種の機能は、プログラムをより読みやすくするのに役立ちます。つまり、パフォーマンスにほとんど影響を及ぼしません。スコープを作成すると思いますが、実行時のパフォーマンスに影響しますか?前もって感謝します。void関数(void)はパフォーマンスにどのような影響を与えますか?

例:

void function(void){ 
//code 
} 

int main() 
{ //c++ 
//rawcodeSameAsInFunction //"faster"? 
function(); //"slower"? 
return 0; 
} 
+1

本当に機能が何をしているかによって異なります。単純な加算を行い、結果を返すだけで、関数を呼び出すオーバーヘッドはコードをインライン化するよりもはるかに大きいです。一方、その場合でも、パフォーマンスへの影響はごくわずかです。また、関数を使うと、読みやすさが向上し、保守性が向上します。これは本当に重要です。最後に、プログラムが完了するまで、パフォーマンスを最適化したり、心配することはありません。 ***ボトルネックがどこにあるのかを知り、必要な場合にのみそれらを最適化します。 –

+1

あなたはベンチマークをしましたか?マシンコードを見て? – Olaf

+0

無料のランチと考えてください。関数呼び出しを排除すると、パフォーマンスに検出可能な影響があったときに、私は決して遭遇しませんでした。 – dasblinkenlight

答えて

4

は、最適化に依存します。コンパイラーがインライン化できると判断した場合、オーバーヘッドはゼロになります。さもなければ、関数呼び出しのオーバーヘッドがあり、それが重要であるかどうかはコンテキストに依存します。コンパイラのアセンブラ出力を確認して、特定のケースで何が起こるかを確認することができます。

コンパイラを支援するには、関数static(エクスポートされていない)を作成する必要があります。 inlineを追加してインライン展開を要求することもできますが、実際にはコンパイラに決定させる方が良いかもしれません。

2

コードは一般に、読みやすさ、保守性、コード再利用性などの理由から機能に分割されます(それ以外の場合は同じコードを複製する必要があります)

質問の一般化されたバージョンは次のとおりです。現在のレジスタの状態を保存したり、引数をスタックにプッシュしたり、スタックポインタなどを移動させたりするためにオーバーヘッドが発生することがあります(多くはcalling conventionsに依存し、コンパイラの最適化など)。しかし、特定の機能が顕著なパフォーマンスをもたらすかどうかは分かりにくいです。唯一の方法はベンチマークと測定です。

関連する問題