下午好,我正在使用java.lang.StringBuilder来存储一些角色。我不知道我要提前存储多少个角色,除了:
我们如何计算应该使用的最佳初始缓冲区长度?
目前我正在使用new java.lang.StringBuilder(4000)
但这只是因为我以前懒得思考。
答案 0 :(得分:12)
这里有两个因素:时间和内存消耗。时间主要受java.lang.AbstractStringBuilder.expandCapacity()
被调用的次数的影响。当然,每次调用的成本与缓冲区的当前大小成线性关系,但我在这里简化并只计算它们:
expandCapacity()
(时间)StringBuilder
将扩展0次StringBuilder
将扩展8次StringBuilder
将扩展11次 expandCapacity
的预期数量为3,23。
StringBuilder
将扩展0次StringBuilder
将扩展3次 expandCapacity
的预期数量为0,03。
正如您所看到的,第二种情况似乎要快得多,因为它很少需要扩展StringBuilder
(每100个输入三次)。但请注意,第一次扩展不太重要(复制少量内存);此外,如果您在巨大的块中向构建器添加字符串,它将在更少的迭代中更加热切地扩展。
另一方面,内存消耗增长:
StringBuilder
将占用16个字符StringBuilder
将占用4K个字符StringBuilder
将占用32K字符预期的平均内存消耗为: 1935 个字符。
StringBuilder
将占用4K个字符StringBuilder
将占用32K字符预期的平均内存消耗为: 4383 字符。
这让我相信将初始缓冲区扩大到4K会使内存消耗增加两倍以上,同时将程序加速两个数量级。
底线是:试试!编写一个能够处理具有不同初始容量的不同长度的百万字符串的基准并不难。但我相信更大的缓冲区可能是一个不错的选择。