首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >这是否意味着Java Math.floor非常慢?

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

Stack Overflow用户
提问于 2012-08-21 14:18:41
回答 6查看 5.8K关注 0票数 19

我不太喜欢Java。

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

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

在代码中存在一个执行相关任务的floor函数。

有没有人知道解决这个问题的范例方法?,我注意到我的floor()函数是用一个叫做StrictMath的东西定义的。有没有像-ffast-math这样的东西?我期待着有一种方法可以将floor函数更改为计算上更合理的方法,而不需要我自己编写。

公共静态双层( double a) { return StrictMath.floor(a);//默认执行委托给StrictMath }

编辑

所以一些人建议我试着做一个演员。我试过了,walltime绝对没有变化。

代码语言:javascript
复制
private static int flur(float dF)
{
    return (int) dF;
}

413742 cast floor函数

394675 Math.floor

这些测试是在没有分析器的情况下运行的。有人试图使用分析器,但运行时被彻底改变了(15+分钟,所以我退出了)。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-08-21 15:14:10

这里是对你的假设的一个理智检查,即代码实际上在floor中花费了99%的时间。让我们假设您有算法的Java和C++版本,这两个版本的算法产生的输出都是正确的。为了便于讨论,我们假设两个版本调用等价的floor函数的次数相同。所以时间函数是

代码语言:javascript
复制
t(input) = nosFloorCalls(input) * floorTime + otherTime(input)

其中,floorTime是在平台上调用floor所用的时间。

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

如果假设为假,这里有两种可供选择的分析结果解释。

  1. 这是一个测量异常;即分析器不知何故弄错了。尝试使用不同的profiler.
  2. There是Java版本代码中的一个错误,导致它调用floor的次数比在C++版本代码中调用的次数要多得多。
票数 6
EN

Stack Overflow用户

发布于 2012-08-21 14:34:24

你可能想试一试FastMath

这里有一篇关于performance of Math in Java vs. Javascript的文章。有一些关于为什么默认数学库很慢的很好的提示。他们正在讨论floor以外的其他操作,但我猜他们的发现可以推广。我发现它很有趣。

编辑

根据this bug entry的说法,floor已经在7(b79),6u21(b01)中实现了纯java代码,从而获得了更好的性能。JDK 6中的floor代码仍然比FastMath中的代码长一点,但可能不会产生这样的性能。降级。您使用的是什么JDK?你能试试更新的版本吗?

票数 8
EN

Stack Overflow用户

发布于 2012-08-21 14:41:46

在我的机器上,Math.floor()的速度非常快,在一个紧凑的循环中,每次调用大约7纳秒。(Windows 7、Eclipse、Oracle JDK 7)。我预计它在几乎所有的情况下都会非常快,如果它被证明是瓶颈,我会感到非常惊讶。

一些想法:

  • 我建议在没有运行的分析器的情况下重新运行一些基准测试。当探查器检测二进制文件时,有时会产生虚假的开销--特别是对于像Math.floor()这样的可能内联的小函数。
  • 尝试了几个不同的JVM,您可能遇到了一个晦涩难懂的错误,请尝试优秀的
  • Commons Math库中的FastMath类,该库包括一个新的floor实现。如果它更快,我真的会很惊讶,但你永远不会知道。
  • 检查你没有运行任何虚拟化技术或类似的技术,这些技术可能会干扰

调用本机代码的能力(包括Math.floor())在内的一些java.lang.Math函数中使用的

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12049314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档