这是否意味着Java Math.floor非常慢?

2022-09-02 12:56:59

我不太喜欢Java。

我正在编写一些优化的数学代码,我对我的分析器结果感到震惊。我的代码收集值,交错数据,然后根据该值选择值。Java的运行速度比我C++和MATLAB实现的速度慢。

我正在使用我正在使用的是 Sun/Oracle JDK 1.7.05javac 1.7.0_05

存在一个 floor 函数,用于在代码中执行相关任务。java math.floor profile results

  1. 有谁知道解决这个问题的范式方法吗?
  2. 我注意到我的函数是用叫做.有没有类似Java的东西?我期望必须有一种方法可以将 floor 函数更改为计算上更合理的函数,而无需编写我自己的函数。floor()StrictMath-ffast-math

    public static double floor(double a) {
        return StrictMath.floor(a); // default impl. delegates to StrictMath
    }
    

编辑

所以有几个人建议我试着做一个演员。我试了一下,墙上完全没有变化。

private static int flur(float dF)
{
    return (int) dF;
}

413742幕墙地板功能

394675 数学.地板

这些测试是在没有探查器的情况下运行的。努力使用探查器,但运行时发生了巨大变化(15分钟以上,所以我退出了)。


答案 1

你可能想试试FastMath

这是一篇关于数学在Java与Javascript中的表现的文章。关于为什么默认的数学库很慢,有一些很好的提示。他们正在讨论其他操作,但我想他们的发现可以推广。我觉得这很有趣。floor

编辑

根据这个 bug 条目,floor 已经在 7(b79), 6u21(b01) 中实现了纯 java 代码,从而获得了更好的性能。JDK 6 中的 floor 代码仍然比 FastMath 中的代码长一些,但可能不会造成这样的性能。退化。您使用的是 JDK?你能尝试使用更新的版本吗?


答案 2

以下是对您的假设的健全性检查,即代码实际上花费了99%的时间。假设您有 Java 和 C++ 版本的算法,这些版本在输出方面都是正确的。为了这个参数的缘故,让我们假设两个版本调用等效函数的次数相同。所以时间函数是floorfloor

t(input) = nosFloorCalls(input) * floorTime + otherTime(input)

在平台上调用所花费的时间在哪里。floorTimefloor

现在,如果你的假设是正确的,并且在Java上要昂贵得多(在某种程度上,它大约需要99%的执行时间),那么你会期望Java版本的应用程序比C++版本慢一大倍(50倍或更多)。如果你没有看到这一点,那么你的假设很可能是错误的。floorTime


如果假设为假,则以下是分析结果的两种替代解释。

  1. 这是一个测量异常;即,分析器以某种方式弄错了。尝试使用其他探查器。

  2. Java 版本的代码中存在一个错误,导致它调用的次数比C++版本的代码中多得多。floor


推荐