最有效的StringBuilder初始容量大小?
我正在写很多东西来登录突发,并优化数据路径。我用建立日志文本StringBuilder
。从内存管理角度来看,最有效的初始容量是什么,因此不管使用JVM,它都能正常工作吗?目标是几乎总是避免重新分配,这应该由大约80-100的初始容量覆盖。但是我也想浪费尽可能少的字节,因为StringBuilder实例可能会在缓冲区中徘徊,浪费的字节会大量出现。
我意识到这取决于JVM,但是应该有一些值,这将浪费最少的字节数,而与JVM无关,这是“最小公分母”。我目前正在使用128-16
,其中128是一个不错的整数,而减法是分配开销。同样,这可能被认为是“过早优化”的情况,但是由于我要回答的是一个“经验法则”数字,因此知道将来也会有用。
我不期望“我的最佳猜测”答案(上面我自己的答案已经是),我希望有人已经对此进行了研究并且可以共享基于知识的答案。
回答:
好吧,我最终自己做了简短的测试,然后在评论后进行了更多测试,以获得经过编辑的答案。
使用JDK 1.7.0_07并测试报告VM名称为“ Java
HotSpot(TM)64位服务器VM”的应用程序,StringBuilder
内存使用的粒度为4个 字符 ,甚至增加了4个字符。
答:从内存分配的角度来看,至少在此64位JVM上 对于StringBuilder来说都是同样好的容量。
通过在不同的测试程序执行(具有相同的初始堆状态)中创建1000000个具有不同初始容量的StringBuilder对象进行测试,并在打印ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed()
之前和之后进行打印。
打印出堆大小也得到了确认,StringBuilder
由于Java
char为2个字节长,实际上为每个缓冲区的堆实际分配的数量是8字节的偶数倍。换句话说,分配1000000个初始容量为1..4的实例所花费的内存要比分配相同数量的初始容量为5
… 8的相等数量的内存少8兆字节(每个实例8个字节)。
以上是 最有效的StringBuilder初始容量大小? 的全部内容, 来源链接: utcz.com/qa/423691.html