创建对象时Java是否很慢?

时间:2014-01-10 22:00:20

标签: java performance oop new-operator object-construction

在我当前的项目(OpenGL Voxel Engine)中,我在生成模型时遇到了严重的问题。我有一个非常面向对象的结构,这意味着我的顶点的单个参数都是Object s。这样我就可以在大约5秒钟内为750个体素创建大约75000 Object s。在分配新的Object时,Java真的很慢吗?或者我错过了代码中某个地方的重大故障?

6 个答案:

答案 0 :(得分:3)

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

有些问题:

  1. 避免最终确定方法,
  2. 调整内存和GC以避免过多的GC活动,
  3. 避免构造函数中的大工作,
  4. 在对象构建期间不要使用同步调用,
  5. 使用弱引用
  6. 这些问题解决了我的问题。

    另见http://oreilly.com/catalog/javapt/chapter/ch04.html

    最后,让我向您推荐(已弃用)对象池模式或重用对象。

    结束,不,一般来说,java对象创建并不慢

答案 1 :(得分:2)

简单地创建75,000个对象不应该花费5秒钟。看看你的构造函数正在做的工作。除了创建对象之外,您还在做什么?您是否尝试过对代码进行计时以查明延迟发生的位置?

答案 2 :(得分: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));
    }
}

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

答案 3 :(得分:1)

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

75000个对象不会花费很长时间来创建,试试这个:

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时,它终于花了一秒钟......

答案 4 :(得分:1)

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

虽然新操作员仍然可能成为瓶颈,但在您的情况下肯定不是问题。创建75K对象的速度应该快于5秒。

答案 5 :(得分:0)

创建新对象时遇到相同的问题。

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

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

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

我创建的该对象位于主游戏循环中。