Mik*_*ail 18 java performance profiling floor
我不是很多Java.
我正在编写一些优化的数学代码,我对我的分析器结果感到震惊.我的代码收集值,交错数据,然后根据它选择值.Java运行速度比我的C++和MATLAB实现慢.
我正在使用javac 1.7.0_05
我正在使用Sun/Oracle JDK 1.7.05
存在一个在代码中执行相关任务的floor函数.

我注意到我的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分钟以上,因此我退出了).
这是一个完整性检查您的假设,即代码实际上占用了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++版本慢.如果你没有看到这一点,那么你的假设很可能是错误的.
如果假设为假,则以下是对分析结果的两种替代解释.
这是测量异常; 即分析器以某种方式弄错了.尝试使用不同的探查器.
您的代码的Java版本中存在一个错误,导致它floor比C++版本的代码调用多次,多次.
Math.floor()我的机器上的速度非常快,每次通话大约7纳秒.(Windows 7,Eclipse,Oracle JDK 7).我希望它在几乎所有情况下都会非常快,如果它成为瓶颈,那将会非常惊讶.
一些想法:
Math.floor()可能内联的小功能.FastMath在优秀的Apache Commons Math库中尝试该类,其中包括一个新的floor实现.如果它更快,我会感到非常惊讶,但你永远不会知道.java.lang.Math功能中使用Math.floor())| 归档时间: |
|
| 查看次数: |
4858 次 |
| 最近记录: |