我正在编写一个带有字符串并将其格式化为引用可打印的例程。它必须尽可能快。我的第一次尝试将字符从一个字符串缓冲区复制到另一个编码和沿途的换行。然后我认为修改原始的stringbuffer可能会更快,而不是复制所有大部分相同的数据。事实证明插入比复制要糟糕得多,第二个版本(使用stringbuffer插入)慢了8倍,这是有道理的,因为它必须移动大量内存。
我所希望的是某种间隙缓冲区数据结构,因此插入内容不会涉及物理移动其余字符串缓冲区中的所有字符。
那么有关建议每隔一段时间翻一次字符串插入字符串的最快方法吗?
使用标准mimeutils库的建议没有帮助,因为我也是在逃避字符串,因此可以一次性将其转储到smtp服务器上。
答案 0 :(得分:6)
最后,您的间隙数据结构必须转换为String,这需要通过将它们附加到StringBuilder来将所有块组装在单个数组中。
因此直接使用StringBuilder会更快。我认为你不会找到比这更快的技术。确保使用足够大的StringBuilder初始化,以避免在容量耗尽时复制整个缓冲区。
答案 1 :(得分:1)
所以在这里听取其他一些答案的建议我一直在编写这个函数的许多版本,看看哪些是最快的,并且如果有人能从我发现的东西中获益,将来的参考:
1)最慢的:stringbuffer.append(),但我们知道。
2)快几乎两倍:stringbuilder.append()。锁似乎非常昂贵。
3)另一个更快20%......从一个char []复制到另一个。[/ p>
4)最后,比其快三倍... JNI调用在C中编译的完全相同的代码,从一个char数组复制到另一个char数组。
你可能会考虑#4作弊,但是骗子会赢。这是迄今为止最快的方式。
GetCharArrayElements调用存在一个风险,导致java char数组被复制,因此它可以传递给C程序,但我不知道是否发生了这种情况,与任何java实现相比,它仍然很快。
答案 2 :(得分:0)
我认为速度和编码优雅之间的良好平衡将使用Matcher.appendReplacement
。制定一个能够捕获所有插入点的正则表达式。在循环中,您使用find
,分析Matcher.group()
以查看确切匹配的内容,并使用您的程序逻辑来决定向appendReplacement
提供什么。
在任何情况下,重要的是不要通过char复制char上的文本。您必须以最大的块进行复制。
Matcher
API非常不幸地绑定到StringBuffer
,但是,正如您所发现的那样,只会使最终的5%与您有关。