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