Java 在创建对象时的性能

标签 java performance final

我正在努力提高我在 Java 性能优化方面的知识,我尝试了多种方法来创建一个对象。
我遇到了这种我不熟悉的关于在类中使用 final 成员的行为:如果成员不是 final,则对象的创建要便宜得多(就时间而言)。它是正确的还是我的代码中存在一些缺陷?

没有最终成员的对象:

public class ComplexNumber {
    private double re, im;

    public ComplexNumber(double _re, double _im) {
        re = _re;
        im = _im;
    }

    public void setRe (double _re) {
        re = _re;
    }

    public void setIm (double _im) {
        im = _im;
    }

    @Override
    public String toString() {
        return re + " + i" + im;
    }

    @Override
    public int hashCode() {
        return 47 + 31*(int)re + 31*(int)im;
    }
}  

具有最终成员的对象:

public class FinalComplexNumber {
    private final double re, im;

    public FinalComplexNumber(double _re, double _im) {
        re = _re;
        im = _im;
    }

    @Override
    public String toString() {
        return re + " + i" + im;
    }

    @Override
    public int hashCode() {
        return 47 + 31*(int)re + 31*(int)im;
    }
}  

主类

public class PerformanceTest {

    private static final long ITERATIONS = 100000000l;

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {


        ComplexNumber nr = new ComplexNumber(0, 0);
        System.out.println(nr);

        long time = System.currentTimeMillis();
        for (int i = 0; i < ITERATIONS; i++) {
            ComplexNumber num = new ComplexNumber(i, i);
        }
        System.out.println(System.currentTimeMillis() - time);

        time = System.currentTimeMillis();
        for (int i = 0; i < ITERATIONS; i++) {
            nr.setIm(i);
            nr.setRe(i);
        }
        System.out.println(System.currentTimeMillis() - time);

        time = System.currentTimeMillis();
        for (int i = 0; i < ITERATIONS; i++) {
            FinalComplexNumber num = new FinalComplexNumber(i, i);
        }
        System.out.println(System.currentTimeMillis() - time);
    }
}  

结果:

run:
0.0 + i0.0
953
219
7875
BUILD SUCCESSFUL (total time: 9 seconds)

最佳答案

the creation of an object is far less expensive (in terms of time) if the members are not final.

不,绝对不是这样。基本上,您的基准测试方法已损坏:

  • 您正在使用 System.currentTimeMillis(),这通常不是基准测试的好主意; System.nanoTime() 是测量elapsed 时间的首选
  • 您没有提供任何 JIT 预热
  • 您没有使用您创建的对象,这可能允许 JIT 优化,这在更普通的代码中是无效的
  • 您甚至没有尝试从内存垃圾方面的公平竞争环境开始,因此您很可能会发现您的第一个循环不需要执行任何垃圾收集,但你的最后一个循环确实如此。

您可能想看看旨在避免此类问题的微基准测试框架,例如 CaliperJMH .

关于Java 在创建对象时的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30096339/

相关文章:

在静态上下文中无法访问 Java get/set 类

java - 在字符串中的键后面的每个其他标记/值之后插入定界符

python - 为另一个数组中的所有 float 查找数组中最接近的 float

java - 使用 Mockito 模拟枚举?

Fortran final 例程在变量超出范围之前调用自身

java - Java中的final变量什么时候不能再被修改?

java - 我需要在 Excel 中插入值。我该怎么做?

java - 带有关联表达式的 Camel 聚合器

android - 从 json 响应中的字节数组下载图像

mysql - 多变量where子句的最佳mysql索引