我正在阅读一本关于 2D 游戏编程的书,正在学习一个用于线性变换的 3x3 矩阵类。作者写了两个3x3矩阵相乘的方法如下。
public Matrix3x3f mul(Matrix3x3f m1)
{
return new Matrix3x3f(new float[][]
{
{
this.m[0][0] * m1.m[0][0] // M[0,0]
+ this.m[0][1] * m1.m[1][0]
+ this.m[0][2] * m1.m[2][0],
this.m[0][0] * m1.m[0][1] // M[0,1]
+ this.m[0][1] * m1.m[1][1]
+ this.m[0][2] * m1.m[2][1],
this.m[0][0] * m1.m[0][2] // M[0,2]
+ this.m[0][1] * m1.m[1][2]
+ this.m[0][2] * m1.m[2][2],
},
{
this.m[1][0] * m1.m[0][0] // M[1,0]
+ this.m[1][1] * m1.m[1][0]
+ this.m[1][2] * m1.m[2][0],
this.m[1][0] * m1.m[0][1] // M[1,1]
+ this.m[1][1] * m1.m[1][1]
+ this.m[1][2] * m1.m[2][1],
this.m[1][0] * m1.m[0][2] // M[1,2]
+ this.m[1][1] * m1.m[1][2]
+ this.m[1][2] * m1.m[2][2],
},
{
this.m[2][0] * m1.m[0][0] // M[2,0]
+ this.m[2][1] * m1.m[1][0]
+ this.m[2][2] * m1.m[2][0],
this.m[2][0] * m1.m[0][1] // M[2,1]
+ this.m[2][1] * m1.m[1][1]
+ this.m[2][2] * m1.m[2][1],
this.m[2][0] * m1.m[0][2] // M[2,2]
+ this.m[2][1] * m1.m[1][2]
+ this.m[2][2] * m1.m[2][2],
},
});
}
如果我个人需要编写一个方法来做同样的事情,我会想出一些自动完成所有这些计算的嵌套循环,我假设也许作者是这样写的,以便那些很少数学背景可以更容易理解。
这听起来像是一个合理的假设,还是当在性能至关重要的循环中大量使用时,此方法的嵌套循环版本可能会导致性能问题?
最佳答案
我认为这是一个性能问题。 如果你使用循环,它会使用很多跳转命令,因为每次迭代都需要检查“if cond goto ___”。你应该在 Branch Prediction 上阅读这篇文章并了解一些计算机体系结构以了解指令如何影响性能,在这种情况下,我认为您可能会发现缓存很有趣。
关于java - 嵌套循环与硬编码矩阵乘法的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27330199/