3

我正在编写一个例程,该例程接受一个字符串并将其格式化为带引号的可打印。而且它必须尽可能快。我的第一次尝试将字符从一个字符串缓冲区复制到另一个编码并沿途换行。然后我认为只修改原始字符串缓冲区而不是复制所有几乎相同的数据可能会更快。结果插入比复制差得多,第二个版本(带有字符串缓冲区插入)慢了 8 倍,这是有道理的,因为它必须移动大量内存。

我希望的是某种间隙缓冲区数据结构,因此插入不会涉及物理移动字符串缓冲区其余部分中的所有字符。

那么关于每隔一段时间插入字符的字符串的最快方法有什么建议吗?

使用标准 mimeutils 库的建议没有帮助,因为我还对字符串进行了转义,因此可以一次性将其转储到 smtp 服务器。

4

3 回答 3

6

最后,您的间隙数据结构必须转换为字符串,这需要通过将所有块附加到 StringBuilder 来将所有块组装到一个数组中。

所以直接使用 StringBuilder 会更快。我不认为你会找到比这更快的技术。确保使用足够大的大小初始化 StringBuilder 以避免在容量耗尽时复制整个缓冲区。

于 2012-07-10T13:02:51.620 回答
2

因此,在这里接受其他一些答案的建议,我一直在编写这个函数的许多版本,看看什么是最快的,如果有人能从我的发现中获益,以供将来参考:

1) 最慢的:stringbuffer.append() 但我们知道。

2) 几乎快两倍:stringbuilder.append()。锁似乎很贵。

3) 再快 20% 是......从一个 char[] 复制到另一个。

4) 最后,速度甚至比这快三倍……对用 C 编译的完全相同的代码进行 JNI 调用,该代码从一个 char 数组复制到另一个。

您可能会考虑 #4 作弊,但作弊者会赢。这是迄今为止最快的方法。

GetCharArrayElements 调用存在导致复制 java char 数组以便将其交给 C 程序的风险,但我不知道这是否正在发生,而且与任何 java 实现相比,它仍然非常快。

于 2012-08-06T19:09:49.087 回答
0

我认为速度和编码优雅之间的良好平衡将使用Matcher.appendReplacement. 制定一个将捕获所有插入点的正则表达式。在您使用的循环find中,分析Matcher.group()以查看完全匹配的内容,并使用您的程序逻辑来决定要给appendReplacement.

无论如何,重要的是不要逐个字符地复制文本。您必须复制尽可能大的块。

不幸的是, MatcherAPI 绑定到 . StringBuffer,但是,正如您所发现的那样,它只能从您那里获得最后的 5%。

于 2012-07-10T13:07:15.313 回答