C循环优化与条件循环变量
抱歉,如果这是在档案中提出.我发现了一些类似的问题,但没有一个似乎正是我想要的.
我正在研究的问题的蒸馏版本如下.我有一系列计算来执行,它将在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].如果使用优化编译器进行了重大改进,我会感到惊讶,但是你永远不会… 如果没有别的,通过这个练习将会教你如何编译器和C语言的工作方式.祝你好运! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |