私は、最適化された Apple LLVM 4.0 でコンパイルする ios プロジェクトに取り組んでいます。関数の 2 つの異なるバージョンを実装しました。1 つは C で、もう 1 つは NEON です。私は彼らのパフォーマンスを互いにテストしたかった. 私の考えは、両方を同じ回数呼び出してから、Time Profiler で調べて、それぞれに費やされた相対的な時間を確認することでした。もともと私のコードは次のように見えました
used_value = score_squareNEON(patch, image, current_pos);
used_value = score_squareC(patch, image, current_pos);
時間をプロファイリングすると、NEON コードはまったく表示されませんでした。次に試したのは
for(int i = 0; i < successively_bigger_numbers; i++)
{
used_value = score_squareNEON(patch, image, current_pos);
{
used_value = score_squareC(patch, image, current_pos);
まだNEONコードからの貢献はありません。次は
used_value = score_squareNEON(patch, image, current_pos);
test = score_squareC(patch, image, current_pos);
テストが読み取られなかった場所。何もない。それで
test = score_squareNEON(patch, image, current_pos);
test = 0;
other_used_variable += test;
used_value = score_squareC(patch, image, current_pos);
まだ何もありません。最終的に両方の機能を実行させたのは
value = score_squareNEON(patch, image, current_pos);
test = score_squareC(patch, image, current_pos);
...
min = (value+test)/2; //before it was min=value;
また、非常に重要です。関数は両方とも、私がそれらを呼び出していた同じファイルで定義されていました。関数宣言を別のファイルに移動しようとすると、すべての例で両方が呼び出されます。
まず第一に、私はコンパイラに対して多くの敬意を払っています。第二に、関数が確実に呼び出されるようにするには、正確に何をする必要がありますか? これにより、これまで計時してきたすべてのことに疑問を抱くようになりました。通常のパターンだとどうなるか
timerStart();
functionCall();
timerEnd();
中間の関数は完全に最適化されますか? 毎回何らかの形でこれをチェックし始める必要がありますか、それとも使用できるトリックはありますか? コンパイラが関数呼び出し全体を最適化できるタイミングを管理するルールは何ですか?