【发布时间】:2012-08-03 02:22:06
【问题描述】:
我正在使用 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();
中间的函数被完全优化了?我是否需要每次都以某种方式开始检查,还是有什么技巧可以使用?编译器何时可以优化整个函数调用的规则是什么?
【问题讨论】:
-
我很好奇,在您的原始测试中,当函数调用被优化时,静态分析器是否会通知您某些值永远不会被读取?当编译器认为你正在做的事情毫无意义时,Clang 的输出可以作为粗略的指导。
-
从我的简短测试看来,静态分析器警告似乎是必要的,但还不够。当函数在同一个文件中时,它会警告所有情况,说明存储在 test 中的值永远不会被读取。当函数声明移动到不同的文件时,它会继续发出警告,在这种情况下,函数调用不会被优化。
标签: c++ ios optimization compilation llvm