0

作为填充搜索引擎过程的一部分,我还填充了 Berekely-DB 值存储。这个过程每晚重复一次,目前每晚总运行时间的 +/- 60% 是由创建要插入值存储的值引起的(因此不包括实际插入 Berekely-DB 和导致的时间由 Berekely 客户提供

这些值是通过为每个键分配一个 stringbuilder 来创建的,并且平均将大约 1000 个字符串附加到这样的 stringbuilder 中。结果值平均约为 10k。我想知道这是否可以更有效地完成,因为: - 附加到每个 Stringbuilders 的(平均)1000 个字符串具有固定长度:即:每个 String 具有相同的长度,并且这个长度是预先知道的) - 所有字符串附加到末尾。

例如,将 stringbuilder 换成 char[] 或 characterStream / writer 会更高效吗?这样我就可以在 char[] 中保留并索引写入的位置。

谢谢, Geert-Jan

4

4 回答 4

5

您可以创建具有更高初始容量的字符串构建器以减少调整大小的数量,即有一个构造函数可以让您说

int SIZE=10000;
StringBuilder b = new StringBuilder(SIZE);

我希望手动处理 char[] 和索引不会对此有太大改进,因为(我假设)这就是 StringBuilder 已经为您做的事情。

于 2009-11-17T17:53:12.673 回答
0

这 1000 个字符串来自哪里?我很难相信这 1000 个对象的创建时间并不能完全使您的 StringBuilder 摊销扩展所需的时间相形见绌。

于 2009-11-17T19:37:54.043 回答
0

你应该试试绳索。该站点在细节上很吝啬,但这里有一篇很棒的文章其中有更好的描述和一些比较附加性能的良好基准

我实际上并没有使用过绳索包,没有足够好的借口。不过,看起来很有希望。

编辑:附加基准信息

我从绳索文章下载了PerformanceTest课程,并添加StringBuilder了除StringBuffer. 的性能提升StringBuilder似乎可以忽略不计。

我从ropes文章中下载了测试代码并将测试更改为包含StringBuilderStringBuffer.

追加计划长度:260
[StringBuilder] 平均值 = 117,146,000 ns 中值 = 114,717,000ns
[StringBuffer] 平均值 = 117,624,400 ns 中值 = 115,552,000ns
[绳索] 平均 = 484,600 ns 中值 = 483,000ns

追加计划长度:300
[StringBuilder] 平均值 = 178,329,000 ns 中值 = 178,009,000ns
[StringBuffer] 平均值 = 217,147,800 ns 中值 = 216,819,000ns
[绳索] 平均 = 252,800 ns 中值 = 253,000ns

追加计划长度:500
[StringBuilder] 平均值 = 221,356,200 ns 中值 = 214,435,000ns
[StringBuffer] 平均值 = 227,432,200 ns 中值 = 219,650,000ns
[绳索] 平均值 = 510,000 ns 中值 = 507,000ns

StringBuilder 和 StringBuffer 之间的区别并没有那么大。对于手头的任务,绳索在这里似乎是一个明显的胜利。

于 2009-11-18T02:47:23.213 回答
0

修订三:

如果 StringBuilders 中的字符串连接花费的时间过长,那么您的内存可能已经很满了。所以我们的目标是在不占用大量内存的情况下实现字符串连接。希望 CPU 时间的节省会自动随之而来。

我的计划是这样的:您可以构建一个对那些(预先存在的)字符串的引用列表,而不是将这些子字符串连接成一个长的 StringBuilder。引用列表应该比子字符串的总和短,从而消耗更少的内存。

只有当需要存储那个大字符串时,我们才会将各个部分连接到一个大的 StringBuilder 中,取出 String,存储 String,丢弃对 String 的引用,清除 StringBuilder,重复。我觉得这是一个绝妙的解决方案!

但是, 从 2002 年的这篇文章中,数组中的字符串引用(可能同样在 ArrayList 中)占用了高达 8 个字节! 最近的 StackOverflow 帖子证实了这一点。因此,对 10 字节字符串的引用列表每个字符串仅节省 2 个字节。因此,我将我的“解决方案”作为类似问题的可能性提出,但我认为这个特定问题无法从中受益。

于 2009-11-18T08:21:52.273 回答