我正在分析一个Java应用程序,并发现对象分配的速度比我预期的慢得多。我运行了一个简单的基准测试,尝试确定小对象分配的总体速度,结果我发现在我的机器上分配一个小对象(三个浮点数的向量)需要约200纳秒。我正在运行一个双核2.0 GHz处理器,所以这大约相当于400个CPU周期。我想问一下在这里曾经进行过Java应用程序分析的人,是否可以预期这种速度。对我来说这似乎有点残酷和不寻常。毕竟,我认为像Java这样可以压缩堆并重新定位对象的语言,其对象分配应该类似于以下内容:
int obj_addr = heap_ptr;
heap_ptr += some_constant_size_of_object
return obj_addr;
这是几行汇编代码。至于垃圾回收,我没有为其分配或丢弃足够的对象,因此不需要考虑垃圾回收。当我通过重用对象来优化我的代码时,我可以获得每个需要处理的对象约15纳秒/对象的性能,而不是每个需要处理的对象约200纳秒/对象的性能,因此重用对象可以极大地提高性能。我真的不想重用对象,因为这会使符号有点混乱(许多方法需要接受一个“receptacle”参数而不是返回值)。
所以问题是:对象分配需要这么长时间是正常的吗?还是我的机器出了一些问题,一旦修复就可以在这方面获得更好的性能?对于其他人来说,小对象分配通常需要多长时间,有典型值吗?我正在使用客户端机器,目前没有使用任何编译标志。如果你的机器速度更快,你的JVM版本和操作系统是什么?
我知道个人的性能可能差异很大,但我只是想问一下我上面提到的数字是否在合理范围内。