在我当前的项目(OpenGL Voxel Engine)中,我在生成模型时遇到了严重的问题。我有一个非常面向对象的结构,这意味着我的顶点的单个参数都是Object
s。这样我就可以在大约5秒钟内为750个体素创建大约75000 Object
s。在分配新的Object
时,Java真的很慢吗?或者我错过了代码中某个地方的重大故障?
答案 0 :(得分:3)
非常重要的问题。一般来说,它取决于对象类的定义和构造对象所需的工作量。
有些问题:
这些问题解决了我的问题。
另见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下降到四分之一的值。
我通过重用旧对象并重置其状态来解决此问题(顺便说一句,此方法重新分配此数组而不会损失性能)。
如果将分配数组移到单独的方法中并在创建对象后调用它,则速度不会增加到可接受的值。
我创建的该对象位于主游戏循环中。