Java在创建对象时速度慢吗?

Java在创建对象时速度慢吗?,java,performance,oop,new-operator,object-construction,Java,Performance,Oop,New Operator,Object Construction,在我当前的项目(OpenGL体素引擎)中,我在生成模型时遇到了一个严重的问题。我有一个非常面向对象的结构,这意味着即使是顶点的单个参数也是objects。这样,我在大约5秒内为750个体素创建了大约75000个对象。Java在分配新的对象时真的这么慢吗?还是我在代码中错过了一个大的失败?简单地创建75000个对象应该不需要5秒钟。看看你的构造器正在做的工作。在此期间,除了创建对象之外,您还做了什么?您是否尝试过对代码计时以确定延迟发生的位置?这是一个很大的问题。一般来说,它取决于对象类定义和构造

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

简单地创建75000个对象应该不需要5秒钟。看看你的构造器正在做的工作。在此期间,除了创建对象之外,您还做了什么?您是否尝试过对代码计时以确定延迟发生的位置?

这是一个很大的问题。一般来说,它取决于对象类定义和构造对象所需的工作量

一些问题:

  • 避免最后确定方法
  • 调整内存和GC以避免过多的GC活动
  • 施工过程中避免大的工作
  • 在对象构造期间不要使用syncronization调用
  • 使用弱引用
  • 这些问题解决了我的问题

    另见

    最后,我建议您使用(不推荐使用的)对象池模式或重用对象


    总之,不,一般来说,java对象创建并不慢

    对象将比原语慢,而且它们还将消耗相当多的内存,因此您可能对它们太过分了。很难说没有看到更多的细节

    创建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());
    }
    
    List number=new ArrayList();
    
    对于(int i=0;i而言,与没有自动内存管理的语言中的常用方法相比,java中的新运算符速度非常快(例如,新运算符通常比C中的malloc命令快,因为它不需要系统调用)


    虽然新的操作员仍然可能是一个瓶颈,但这肯定不是您的问题。创建75K对象应该比5秒快得多。

    当然不是。下面的代码分配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));
        }
    }
    
    公共类测试{
    公共静态void main(字符串[]args){
    对象[]o=新对象[10_000_000];
    长启动=System.nanoTime();
    for(int i=0;i

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

    我在创建新对象方面也有同样的问题

    构造器中的我的对象分配单个三维数组64x64x64,不多。FPS下降到值的四分之一

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

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


    <>这个对象是在主游戏循环中的。

    在对象的类型中有所不同。因为你使用的是对象类型,一个好的JVM在创建对象方面可能比C++系统更快。只是java中使用了这么多对象(特别是当应用程序设计得很差)。。这还取决于对象可能存在的时间,如果您正在创建一组寿命较短的对象,GC可能会启动,从而降低性能。我以前实现过对象池,win允许使用基本的Swing图形从500个移动对象移动到4500个……好的,我只是本地化了,我正在为每个顶点重新设置VBO我添加了。问题解决了。感谢这个有趣的网站,但我想我刚刚崩溃了服务器。我在有问题的命令中说,我在我的引擎中发现了错误。在这一点上,我认为问题在于第3点:在构建过程中做了大量工作。我只想更改
    中的最后一句话一般来说,Java在创建ing object
    。几个月前我发现了一些基准测试来证明这一点,我应该寻找它们again@Mardavi如果您可以检索基准测试,那么从一开始就非常有趣:顺便说一句,这也很有趣(不显示结果,但它深入到java性能监控中):