2016-09-23 20 views
1

質問は非常に簡単です - 関数に与えられた実際のパラメータをチェックするとパフォーマンスが低下しますか?実際のパラメータのパフォーマンスの影響の影響

エクスポートされたライブラリ関数は、通常、ユーザーコードによって渡された実際のパラメータをチェックする傾向がある:

if (arg1 == NULL || arg2 == NULL) 
    return -EINVAL; 

は、このチェックは、パフォーマンスの低下を招くのか?私はいくつかのエクスポートされた関数(私はよく行動ユーザーであり、常に有効なパラメータを渡すことに依存している)からこれらのチェックを削除することによっていくつかのライブラリコードを最適化しようとしましたが、私は本当の改善に気付きませんでした。

私の最初の推測は、現代のプロセッサの分岐予測がif分岐が取られないと仮定し、実際のペナルティなしでコードを進めることです。これが本当に理由なら、そのような分岐予測機構の限界は何ですか?これらのチェックを外すとパフォーマンスが向上するシナリオはありますか?これは、Cなどのネイティブコンパイル言語と、PythonやJavaなどのインタープリターまたはVM言語の間でどのように変化しますか?

私はランタイムパラメータをチェックすることの重要性を認識しています。私はパフォーマンス面に興味を持っています。

+0

実際に知るには、この種のものを広範囲にベンチマークする必要があります。確かにこれに答えるためのワットはありません。また、Linuxカーネルの '__likely'マクロと' __unlikely'マクロを見てください。 –

+0

[this](http://stackoverflow.com/a/11227902/2681632)が興味深いかもしれません。 –

+0

もっと良い質問は、 'NULL'の引数をチェックすることで何か役に立つものがあるかどうかです。 *有効な入力を期待する関数に渡されてはならない*たくさんの*非 'NULL 'ポインタがあります。 'assert()'はより合理的かもしれません。 – EOF

答えて

1

引数のチェックが値の比較と同じくらい単純な場合、このチェックを削除したことによるパフォーマンスの向上は最小限に抑えられます。配列のすべての項目をチェックするか、他の関数を呼び出して各パラメータのチェックを実行するようなチェックが複雑な場合は、パフォーマンスの改善が見られるかもしれません。

よく書かれたライブラリでは、この種のパラメータチェックには時間がかかるべきではありません。開発に影響を与えるボトルネックを見つけようとする場合は、コードの実行をベンチマーク/プロファイリングして、「コード/関数のどの行」が実行に時間を要しているかを判断し、それらの改善に集中する必要があります。

関連する問題