【发布时间】:2012-01-28 17:57:00
【问题描述】:
我正在分析一个 Java 应用程序,发现对象分配的发生速度比我预期的要慢得多。我运行了一个简单的基准测试来尝试确定小对象分配的整体速度,我发现在我的机器上分配一个小对象(3 个浮点数的向量)似乎需要大约 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 ns,因此重用对象极大地提高了性能。我真的不想重用对象,因为这会使符号有点毛茸茸(许多方法需要接受 receptacle 参数而不是返回值)。
所以问题是:对象分配需要这么长时间是否正常?或者我的机器上可能有问题,一旦修复,可能会让我在这方面有更好的表现?小对象分配通常需要多长时间,是否有典型值?我正在使用客户端机器,目前没有使用任何编译标志。如果你的机器速度更快,你机器的 JVM 版本和操作系统是什么?
我意识到,在性能方面,个人里程可能会有很大差异,但我只是想问一下我上面提到的数字是否看起来正确。
【问题讨论】:
-
内存带宽可能会占主导地位。 / 池化会使 GC 效率低下,一旦你的对象被分散,你可能会遇到局部性问题。可能您想要获得最佳性能的是一个具有整数偏移量的大数组(或内存映射缓冲区)。 (这也适用于 C 和 C++。)
标签: java performance memory-management