为什么内联Math.max给出的速度慢200倍以上?

卡米尔·雅罗斯(Kamil Jarosz):

我最近开始对一些Java代码进行基准测试,以使程序获得最佳性能,并注意到了一些奇怪的事情。即,我已经对以下方法进行了基准测试:

private static final int n = 10000;

public static void test0(){
    int m = 0;

    for(int i = 0; i < n; ++i){
        m = Math.max(i, m);
    }
}

public static void test1(){
    int m = 0;

    for(int i = 0; i < n; ++i){
        m = ((i >= m) ? i : m);
    }
}

得到了那些结果:

          | Test 0          | Test 1          | 
----------+-----------------+-----------------+-
Average:  | 51,77 ns        | 13956,63 ns     | 
Best:     | 0,00 ns         | 6514,00 ns      | 
Worst:    | 25,45 ms        | 60,50 ms        | 
Tries:    | 16971233        | 16971233        | 

在SO上搜索之后(即Java中Math.max(a,b)或(a> b)?a:b更快吗?),对我来说肯定test1不会那么慢。

这些方法在30秒内在8个线程上进行了随机测试,我运行的每个基准测试似乎都相似。我用jdk1.8.0_45

那么,为什么test1慢200倍test0

让·洛格(Jean Logeart):

由于Math.max是静态函数,编译器可能会发现代码根本不执行任何操作,而只是通过不执行代码来优化执行!

变量m是函数的局部变量,对其进行分配无济于事,因为它永远不会被读取。

您需要确保执行以某种方式修改了某些内容,以便编译器不会主动对其进行优化。

例如,您可以m在测试结束时简单地打印的值,或者制作m一个可以稍后访问的类变量,甚至可以像我最初在注释中建议的那样对结果求和。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么numpy.power比内联速度慢60倍?

为什么有些float <整数比较的速度慢四倍?

为什么使用Hibernate进行查询缓存会使查询速度慢十倍?

为什么启动速度慢?

为什么Python枚举速度慢?

为什么LiveData速度慢

为什么Matlab Coder速度慢?

为什么我的查询速度慢?

为什么我的Ubuntu速度慢

为什么我的电脑速度慢?

为什么我的无线速度慢?

为什么大数组Java速度慢

为什么我的LDAP登录速度慢?

Rust - 为什么我的程序执行速度非常慢 - 比使用 Node 用 JavaScript 编写的相同程序慢 5 倍以上

为什么数组元素的平均打印速度比C ++中单个对象的打印速度慢?

Python | 为什么访问实例属性的速度比本地速度慢?

为什么在 PgAdmin 中 Java 应用程序查询速度慢但速度快?

为什么我的Python脚本运行速度比HeapSort实现上的速度慢?

Java的Math.abs(INT)优化,为什么这个代码6X倍慢?

为什么Android上的okhttp3比台式计算机执行请求的速度慢?

为什么对小型数据多次调用numpy.linalg.norm速度慢?

基于其他查询结果的SQL查询-为什么速度慢?

与C相比,为什么Go中写入字节的速度慢

为什么Electron.js应用对用户输入的响应速度慢?

为什么Z3在很小的搜索空间中速度慢?

为什么在程序上绘制圆比从纹理读取速度慢?

查询执行速度慢:执行时间长=>非常奇怪为什么?

为什么Exiftool速度慢,从stdin中读取内存占用;快速,小磁盘读取

为什么Windows 8.1笔记本电脑上的Nmap速度慢?