java - 嵌套循环与硬编码矩阵乘法的性能

标签 java performance math matrix

我正在阅读一本关于 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/

相关文章:

javascript - 如何生成一个范围内偏向一个值的随机数?

java - 如何使用 SonarQube 深入分析 Java 切换枚举

java - TableView setRowFactory CSS 选择器

math - float 学有问题吗?

SQL 性能 : UNION or ORDER BY

mysql - 降低 MySQL 命令/作业的优先级(添加索引/其他命令)?

c++ - 此类是否具有严格的弱排序

java - 数组的打印结果很难弄清楚

Java 如何从嵌套的数组列表中删除项目

performance - C++ 性能 : lists and iterators