java.nio.charset.Charset.decode(..)/ encode(..)的快速替代品

Fra*_*See 4 java performance encode decode character-encoding

谁知道更快的方式做什么java.nio.charset.Charset.decode(..)/ 做什么encode(..)

它目前是我正在使用的技术的瓶颈之一.

[编辑]具体来说,在我的应用程序中,我将一个段从java解决方案改为JNI解决方案(因为有一种C++技术最适合我的需求,而不是我正在使用的Java技术).

这种变化带来了速度的显着降低(以及cpu和mem使用量的显着增加).

深入研究我使用的JNI解决方案,java应用程序通过byte []与C++应用程序进行通信.这些byte []由来自java端的Charset.encode(..)生成并传递给C++端.然后当带有byte []的C++响应时,它将通过Charset.decode(..)在java端进行解码.

运行此对一个分析器,我看到Charset.decode(..)和Charset.encode(..)都花了显著很长一段时间相比,JNI解决方案的整个执行时间(我异形只是JNI的解决方案,因为这是我能够很快完成的事情.一旦我解除了我的日程安排,我将在后一个日期描述整个应用程序:-)).

在进一步阅读我的问题时,似乎这是Charset.encode(..)和decode(..)的已知问题,并且它在Java7中得到解决.但是,由于某些限制,迁移到Java7对我来说(暂时不是).

这就是为什么我在这里问一下是否有人知道Java5解决方案/替代方案(对不起,应该提到这是针对Java5的更快)?:-)

ska*_*man 6

javadoc for encode()decode()明确指出这些是方便的方法.例如,对于encode():

在此charset中将Unicode字符编码为字节的便捷方法.

在charset cs上调用此方法会返回与表达式相同的结果

 cs.newEncoder()
   .onMalformedInput(CodingErrorAction.REPLACE)
   .onUnmappableCharacter(CodingErrorAction.REPLACE)
   .encode(bb); 
Run Code Online (Sandbox Code Playgroud)

除了它可能更有效,因为它可以在连续调用之间缓存编码器.

这里的语言有点模糊,但是如果不使用这些便捷方法,可能会提升性能.创建并配置编码器一次,然后重复使用它:

 CharsetEncoder encoder = cs.newEncoder()
   .onMalformedInput(CodingErrorAction.REPLACE)
   .onUnmappableCharacter(CodingErrorAction.REPLACE);

 encoder.encode(...);
 encoder.encode(...);
 encoder.encode(...);
 encoder.encode(...);
Run Code Online (Sandbox Code Playgroud)

即使你认为你已经知道了答案,阅读javadoc总是值得的.