提出这个问题的背景是我正在求解线性化方程系统(Ax = b),其中A是矩阵(通常尺寸小于100x100),x和b是矢量。我正在使用直接方法,这意味着我首先反转A,然后通过x = A ^( - 1)b找到解。此步骤在迭代过程中重复,直到收敛。
我现在正在使用矩阵库(MTL4)的方式:
对于每次迭代,我将A(值)的所有系数复制到矩阵对象中,然后反转。这是最简单,最安全的选择。
改为使用指针数组:
对于我的特定情况,A的系数恰好在每次迭代之间更新。这些系数存储在不同的变量中(有些是数组,有些则不是)。如果我将A设置为包含指向这些系数变量的指针的数组,然后就地反转A,那么是否有可能获得性能提升?
关于最后一个选项的好处是,一旦我在第一次迭代之前在A中设置了指针,我就不需要在连续迭代之间复制任何值。 A中指向的值将在迭代之间自动更新。
所以性能问题归结为这个,正如我所看到的:
- 矩阵反演过程花费的时间大致相同,假设指针的解引用非常昂贵
- 指针数组不需要包含值的矩阵A的额外内存
- 指针数组选项不必在每次迭代之间复制A的所有NxN值
- 指向数组指针选项的值通常不在内存中排序。希望所有值在内存中相对接近,但* A [0] [1]通常不在* A [0] [0]等旁边。
对此有何评论?最后一句话是否会对绩效产生负面影响,从而影响积极的绩效效应?
答案 0 :(得分:2)
测试,测试,测试。
特别是在数值线性代数领域。游戏中有许多效果,这就是为什么有许多优化的库可以解决你的负担。
需要考虑的一些影响:
没有替代测试。
答案 1 :(得分:1)
以下是一些评论:
因此,当您选择指针解决方案时,您将获得以下一组权衡:
答案 2 :(得分:0)
你在这里得到了很好的答案。我唯一要补充的是一些关于性能的一般经验。
您正在考虑先行性能。这是合理的,但真正的回报是后验的。换句话说,在运行代码告诉您之前,您不确定真正的优化机会在哪里。
您不知道大部分时间是用于矩阵求逆,乘法,复制矩阵,解除引用还是什么。人们可以猜到。如果我不得不猜测,它将是矩阵求逆,因为它是100x100。 然而,我猜不出的其他东西可能更大。 猜测的记录非常糟糕,特别是当你可以找出时。