我不太喜欢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绝对没有变化。
private static int flur(float dF)
{
return (int) dF;
}
413742 cast floor函数
394675 Math.floor
这些测试是在没有分析器的情况下运行的。有人试图使用分析器,但运行时被彻底改变了(15+分钟,所以我退出了)。
发布于 2012-08-21 15:14:10
这里是对你的假设的一个理智检查,即代码实际上在floor
中花费了99%的时间。让我们假设您有算法的Java和C++版本,这两个版本的算法产生的输出都是正确的。为了便于讨论,我们假设两个版本调用等价的floor
函数的次数相同。所以时间函数是
t(input) = nosFloorCalls(input) * floorTime + otherTime(input)
其中,floorTime
是在平台上调用floor
所用的时间。
现在,如果您的假设是正确的,并且floorTime
在Java上的成本要高得多(大约需要99%的执行时间),那么您会期望应用程序的Java版本的运行速度比C++版本慢很多(50倍或更多)。如果你没有看到这一点,那么你的假设很可能是错误的。
如果假设为假,这里有两种可供选择的分析结果解释。
floor
的次数比在C++版本代码中调用的次数要多得多。发布于 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?你能试试更新的版本吗?
发布于 2012-08-21 14:41:46
在我的机器上,Math.floor()
的速度非常快,在一个紧凑的循环中,每次调用大约7纳秒。(Windows 7、Eclipse、Oracle JDK 7)。我预计它在几乎所有的情况下都会非常快,如果它被证明是瓶颈,我会感到非常惊讶。
一些想法:
Math.floor()
这样的可能内联的小函数。FastMath
类,该库包括一个新的floor实现。如果它更快,我真的会很惊讶,但你永远不会知道。调用本机代码的能力(包括Math.floor()
)在内的一些java.lang.Math
函数中使用的
https://stackoverflow.com/questions/12049314
复制相似问题