循环拆分性能问题

时间:2016-07-25 09:15:08

标签: c++ performance loops

我在GF(2)上实现了高斯消除过程。我使用二维64位整数数组以行主表示形式存储矩阵(矩阵的行存储在连续数组中)。我以下列方式对矩阵的行实现了高斯消元:

enter image description here

其中(A)^ i表示A的第i行。然后我意识到,如果我按照以下方式在第5-6行分割循环,我的性能稍好一些:

enter image description here

我希望性能略差一些,因为我再次迭代整个外循环......有没有人对这种行为有解释?编译器是否正在做一些棘手的优化工作,这对分割的变体更容易执行? (用g ++ -O3编译)

(如果伪代码没有得到答案,我可以提供一个最小的代码示例)

1 个答案:

答案 0 :(得分:2)

没有理由期望第二个解决方案的性能更差 - 两个算法都在O(n^3),它们甚至具有相同的常量:在第一个解决方案中,外部循环在O(n^3),在第二个解决方案中O(\frac{n^3}{2})中有两个循环。

实际上,您的第二个解决方案可能具有更好的CPU缓存特性或更适合编译器优化。特别是,由于您的操作超过GF(2)/ Z(2),因此它们可以表示为对单词的二进制运算 - 这将导致大的加速。根据您的实现(以及对 n 的约束),算法最终可能会优化为O(n^2)。但是,如果不偷看你的代码,我们无法说出来:)。