我正在使用 Apple LLVM 4.0 进行 ios 项目编译并进行优化。我实现了一个函数的两个不同版本,一个在 C 中,一个在 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();
中间的功能完全优化了吗?我是否需要每次都以某种方式开始检查,还是有什么技巧可以使用?编译器何时可以优化整个函数调用的规则是什么?