首先,我想知道循环优化和转换之间的根本区别,还
C中的一个简单循环如下:
for (i = 0; i < N; i++)
{
a[i] = b[i]*c[i];
}
但我们可以展开它:
for (i = 0; i < N/2; i++)
{
a[i*2] = b[i*2]*c[i*2];
a[i*2 + 1] = b[i*2 + 1]*c[i*2 + 1];
}
但我们可以进一步展开它..但是我们可以展开它的限制是什么,我们如何找到它。
还有更多技术,如循环耕作,循环分配等。 ,如何确定何时使用合适的。
答案 0 :(得分:4)
我会假设OP已经描述了他/她的代码并且发现这段代码实际上很重要,并且实际上回答了问题:-):
编译器将尝试根据它对代码和处理器体系结构的了解,使循环展开决策。
在提高速度方面。
在决定何时停止展开方面:
就你何时应该进行这些优化而言:
当你不认为编译器做了正确的事情。编译器可能不够复杂(或足够最新),足以使用您正在最佳工作的架构知识。
可能,启发式失败了(毕竟它们只是启发式)。一般来说,如果您知道这段代码非常重要,请尝试展开它,如果它提高了性能,请保留它,否则将其丢弃。此外,只有当您拥有大致整个系统时才这样做,因为当您的代码工作集为20k时,当您的代码工作集为31k时可能没有益处。
答案 1 :(得分:3)
对于你的问题,这似乎不是主题,但我不得不强调这一点的重要性。
关键是要编写正确的代码,让代码按照要求运行,而不必担心微观优化。
如果以后您发现您的程序缺乏性能,那么您配置文件!! 您的应用程序以找到问题区域然后尝试优化它们。
请记住,其中一位有智慧的人说It is only 10% of your code which runs 90% of the total run time of your application trick is to identify that code through profiling and then try to optimize it.
答案 2 :(得分:2)
考虑到你的第一次优化尝试已经错误在50%的情况下我真的不会尝试更复杂的东西(尝试任何奇数)。
而不是将你的指数相乘,只需将i加2并再次循环到N--避免不必要的移位(只要我们保持2的幂,但仍然是次要效果)
总结一下:你创建了不正确,慢的代码而不是编译器可以做的 - 这就是为什么你不应该做我认为的这些东西的完美例子。