我正在研究的问题的蒸馏版本如下.我有一系列计算来执行,它将在4(非常大)的数组中存储值:A,B,C和D.这些计算是相互依赖的,例如计算b [i]可能需要使用[i-1].我有能力在一个循环中表达所有的东西,但是导致边缘情况下,对于某些i值,只能执行一些计算.例如:
for(i=0;i<end;i++){ if(i == 0) //calculate A[i+1] and B[i+1] else if (i == end-1) //calculate C[i-1] and D[i-1] else //calculate A[i+1],B[i+1],C[i-1],D[i-1]}
对于性能问题,我想避免在我的循环中有条件.与计算相比,评估条件将是便宜的,但可能不可忽略.我的问题是如果编译器可能可靠地扩展到
//calculate A[1] and B[1]for(i=1;i<end-1;i++){ //calculate A[i+1],D[i-1]}//calculate C[end-2] and D[end-2]
我从档案馆收集,如果条件表达式是不变的,编译器会分解我的循环,但是这里依赖于我,原则上可以通过我的一些计算来改变它.是否会检测到我不会篡改迭代变量,从而以合理的方式将其分开?
额外的信息,以防您决定回答问题,建议一个更好的方式来做事情:
最初代码是用4个循环编写的,用于计算每个数组的元素.这是编写代码最直观的方法,但效率不高.由于在一个数组中计算元素取决于其他数组中的元素,所以这意味着我在四个循环中的每个循环中都必须从内存中读取所有4个数组.由于这些数组不适合高速缓存,这不是最佳的,我需要的代码只能循环一次我的数组.
我也知道我可以用手打破我的循环,事实上现在是如何做的.然而,这些计算涉及到非常重要的公式(在这个循环的每次迭代中,我都无法承担调用函数的性能),所以分解代码导致的代码重复不仅很难阅读,而且几乎不可维护时间我的公式得到调整(他们会…)
提前致谢!
解决方法 在更广泛的意义上回答你的问题:当优化至关重要时,分析器是你的朋友.开发人员在猜测我们的代码中处理器花费大部分时间的时候都是非常糟糕的.分析仪将显示您的“昂贵” *** 作的确切位置,因此您可以专注于修复将给您最重要改进的区域.我很好奇你的声明,“在这个循环的每一次迭代中,”无法承担调用函数的性能.“你怎么知道的?许多现代处理器针对函数调用进行了优化,特别是如果您可以传递一个指针(一个struct?)而不是许多个别参数.如果您的计算确实是“不重要的”,则函数调用的开销可能是微不足道的.
其他事情要考虑:
>作为一个实验,重新索引您的计算,以便它们完全按照我自己的 *** 作,而不是i-1或i 1.所以,例如,使用A [i],B [i],C [i-2]和D [i-2].如果使用优化编译器进行了重大改进,我会感到惊讶,但是你永远不会…
>预先计算任何你可以.
>尝试将您的计算分解成比较常见的或常见的组件,如James Greenhalgh所建议的,因此可能会被重用.
可以更有效地重写方程式吗?分析数学可能会导致一个捷径:也许您可以以封闭的形式重写一些(或全部)迭代.
你可以用更简单的方法来代替你的方程式吗?例如,假设您需要根据距离您家的距离对一组位置进行排序.距离计算需要减法,平方,加法和平方根.一般来说,平方根是迄今为止最贵的 *** 作.但是,如果只需要相对距离,可以跳过平方根:通过距离的平方排序生成相同的排序顺序!
>如果内联不可行,你可以将你的函数(或它们的组件)定义为高效的宏,所以至少你可以避免重复代码?正如你所说,剪贴板继承是可维护性的凡人敌人.
如果没有别的,通过这个练习将会教你如何编译器和C语言的工作方式.祝你好运!
总结以上是内存溢出为你收集整理的C循环优化与条件循环变量全部内容,希望文章能够帮你解决C循环优化与条件循环变量所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)