如果在档案中询问,请道歉.我发现了一些类似的问题,但没有一个看起来正是我想要的.
我正在研究的问题的提炼版本如下.我有一系列要执行的计算,它们将值存储在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]
}
Run Code Online (Sandbox Code Playgroud)
对于性能问题,我想避免在我的循环中有条件.与计算相比,评估条件是便宜的,但可能不可忽略.我的问题是编译器是否可以可靠地将其扩展为
//calculate A[1] and B[1]
for(i=1;i<end-1;i++)
{
//calculate A[i+1], B[i+1], C[i-1], D[i-1]
}
//calculate C[end-2] and D[end-2]
Run Code Online (Sandbox Code Playgroud)
我从档案中收集到,如果条件表达式是常量的,编译器会分裂我的循环,但是这里它们依赖于i,原则上我可以通过一些计算来改变它.它是否会检测到我没有篡改迭代变量,从而以合理的方式将其分开?
如果您决定通过建议更好的方式来回答问题,请提供额外信息:
最初代码是用4个循环编写的,用于计算每个数组的元素.这是编写代码最直观的方法,但效率很低.由于计算一个数组中的元素取决于其他数组中的元素,这意味着我必须在4个循环中的每个循环中从内存中读取所有4个数组.由于这些数组不适合缓存,这不是最佳的,我需要的代码只能在我的数组中循环一次.
我也知道我可以手动分开我的循环,事实上这就是目前的事情.然而,这些计算涉及非平凡的公式(并且我无法承受在此循环的每次迭代期间调用函数的性能损失),因此分解代码导致代码重复,这不仅非常难以阅读,而且几乎无法维护下一个我的公式得到调整的时间(他们将......)
提前致谢!