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

Mik*_*ail 18 java performance profiling floor

我不是很多Java.

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

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

存在一个在代码中执行相关任务的floor函数. java math.floor个人资料结果

  1. 有人知道解决这个问题的范式方法吗?
  2. 我注意到我的floor()函数是用一个叫做的东西来定义的StrictMath.是否有类似-ffast-mathJava的东西?我期待必须有一种方法可以将地板功能更改为更合理的计算方式,而无需编写自己的功能.

    public static double floor(double a) {
        return StrictMath.floor(a); // default impl. delegates to StrictMath
    }
    
    Run Code Online (Sandbox Code Playgroud)

编辑

所以有些人建议我尝试演员.我尝试了这个,而且在时间上没有任何变化.

private static int flur(float dF)
{
    return (int) dF;
}
Run Code Online (Sandbox Code Playgroud)

413742铸造地板功能

394675 Math.floor

这些测试没有分析器.我们努力使用分析器,但运行时间发生了翻天覆地的变化(15分钟以上,因此我退出了).

ewe*_*nli 8

您可能想尝试一下FastMath.

这是一篇关于Java与Javascript中的Math性能的帖子.关于默认数学库缓慢的原因,有一些很好的提示.他们正在讨论其他行动floor,但我猜他们的发现可以概括.我发现它很有趣.

编辑

根据这个bug条目,floor已在7(b79),6u21(b01)中实现了纯java代码,从而提高了性能.JDK 6中的楼层代码仍然比FastMath中的楼层代码长,但可能不负责这样的性能.降解.您使用的JDK是什么?你能试试更新的版本吗?


Ste*_*n C 6

这是一个完整性检查您的假设,即代码实际上占用了99%的时间floor.假设您拥有算法的Java和C++版本,这些版本在它们产生的输出方面都是正确的.为了论证,让我们假设两个版本调用等效floor函数的次数相同.所以时间函数是

t(input) = nosFloorCalls(input) * floorTime + otherTime(input)
Run Code Online (Sandbox Code Playgroud)

在平台上floorTime拨打电话所需的时间floor.

现在,如果您的假设是正确的,并且floorTime在Java上花费的成本要高得多(大约需要大约99%的执行时间),那么您会期望Java版本的应用程序运行一个很大的因素(50倍或更多)比C++版本慢.如果你没有看到这一点,那么你的假设很可能是错误的.


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

  1. 这是测量异常; 即分析器以某种方式弄错了.尝试使用不同的探查器.

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


mik*_*era 5

Math.floor()我的机器上的速度非常快,每次通话大约7纳秒.(Windows 7,Eclipse,Oracle JDK 7).我希望它在几乎所有情况下都会非常快,如果它成为瓶颈,那将会非常惊讶.

一些想法:

  • 我建议在没有运行探查器的情况下重新运行一些基准测试.有时会发生这样的情况:分析器在检测二进制文件时会产生虚假开销 - 特别是对于Math.floor()可能内联的小功能.
  • 试试几个不同的JVM,你可能遇到了一个不起眼的bug
  • FastMath在优秀的Apache Commons Math库中尝试该类,其中包括一个新的floor实现.如果它更快,我会感到非常惊讶,但你永远不会知道.
  • 检查您是否正在运行任何可能干扰Java调用本机代码的能力的虚拟化技术或类似技术(在一些java.lang.Math功能中使用Math.floor())