Java创建对象时慢吗?

问题描述 投票:4回答:6

在我当前的项目(OpenGL Voxel Engine)中,生成模型时存在严重问题。我有一个非常面向对象的结构,这意味着即使顶点的单个参数也是Object。这样,我在5秒钟内为750个体素创建了大约75000 Object。分配新的Object时Java真的这么慢吗?还是我在代码中的某个地方错过了一个大失败?

java performance oop new-operator object-construction
6个回答
3
投票

非常大的问题。一般来说,它取决于对象类的定义以及构造对象所需的工作量。

某些问题:

  1. 避免使用finalize方法,
  2. 调整内存和GC,以避免过度的GC活动,
  3. 避免在构造函数期间进行繁重的工作,
  4. 在对象构建期间不要使用同步调用,
  5. 使用弱引用

这些问题解决了我的问题。

另请参阅http://oreilly.com/catalog/javapt/chapter/ch04.html

最后让我建议您(不建议使用的)对象池模式或重用对象。

总结,不,一般来说,创建Java对象并不慢


2
投票

仅创建75,000个对象应该不需要5秒钟。看看构造函数正在执行的工作。除了创建对象之外,您在这段时间内还做什么?您是否尝试过计时代码以查明延迟发生的位置?


2
投票

当然不是。以下代码分配了1000万个对象,并将它们存储在一个数组中。在我5岁的笔记本电脑上,它可以在1.4秒内完成。

public class Test {
    public static void main(String[] args) {
        Object[] o = new Object[10_000_000];
        long start = System.nanoTime();
        for (int i = 0; i < o.length; i++) {
            o[i] = new Object();
        }
        long end = System.nanoTime();
        System.out.println(Arrays.hashCode(o));
        System.out.println(new BigDecimal(end - start).movePointLeft(9));
    }
}

...即使这个基准测试还很幼稚,因为它不会在启动计时器之前立即触发正在测试的代码的及时编译。


1
投票

对象将比原始对象慢,并且它们还将消耗更多的内存-因此,您可能会过度使用它们。没有看到更多细节就很难说。

虽然75,000个对象将不需要很长时间来创建,请尝试以下操作:

List<Integer> numbers = new ArrayList<Integer>();
    for(int i = 0;i<75000;i++){
        numbers.add(i); // Note this will autobox creating an Integer object after the first 128
    }
    System.out.println(numbers.size());
}

http://www.tryjava8.com/app/snippets/52d070b1e4b004716da5cb4f

花费的总时间少于一秒钟。

[当我将数字增加到7,500,000时,它终于花了一秒钟...


1
投票

与没有自动内存管理的语言中的常规方法相比,java中的new运算符非常快(例如,因为不需要系统调用,因此new运算符通常比C语言中的malloc-command更快。

尽管新操作员仍然可能成为瓶颈,但对于您而言,这当然不是问题。创建75K对象应该比5秒快。


0
投票

我在创建新对象时遇到同样的问题。

我在构造函数中的对象分配单个三维数组64x64x64,仅此而已。 FPS下降到四分之一的值。

我通过重用旧对象解决了这个问题,并重置了它的状态(顺便说一下,此方法重新分配了此数组,而不会损失性能)。

如果将分配数组移到单独的方法中并在创建对象后调用它,则速度不会增加到可接受的值。

我创建的这个对象在主游戏循环中。

© www.soinside.com 2019 - 2024. All rights reserved.