【发布时间】:2016-03-10 23:33:17
【问题描述】:
我举以下例子来说明我的问题:
void fun(int i, float *pt)
{
// do something based on i
std::cout<<*(pt+i)<<std::endl;
}
const unsigned int LOOP = 2000000007;
void fun_without_optmization()
{
float *example;
example = new float [LOOP];
for(unsigned int i=0; i<LOOP; i++)
{
fun(i,example);
}
delete []example;
}
void fun_with_optimization()
{
float *example;
example = new float [LOOP];
unsigned int unit_loop = LOOP/10;
unsigned int left_loop = LOOP%10;
pt = example;
for(unsigend int i=0; i<unit_loop; i++)
{
fun(0,pt);
fun(1,pt);
fun(2,pt);
fun(3,pt);
fun(4,pt);
fun(5,pt);
fun(6,pt);
fun(7,pt);
fun(8,pt);
fun(9,pt);
pt=pt+10;
}
delete []example;
}
据我了解,函数 fun_without_optimization() 和函数 fun_with_optimization() 应该执行相同的操作。第二个函数比第一个更好的唯一理由是fun 中的指针计算变得简单。为什么第二个功能更好的任何其他论点?
【问题讨论】:
-
第二个功能是手动展开循环的不明智尝试。编译器会更有效地为您展开这个循环。
-
这种“优化”是基本的,任何编译器都可以比人类更好地优化
-
与大多数此类问题一样,最好的方法是分析代码并查看哪个更快。
-
“
fun中的指针计算变得简单”是什么意思?fun在这两种情况下不是完全相同吗? -
第二个函数的bug比较多,一定更好。 (真正的程序员使用Duff's device,当然。)
标签: c++ performance