gpt4 book ai didi

Java:比 String(byte[]) 更快的替代品

转载 作者:搜寻专家 更新时间:2023-10-30 21:05:19 25 4
gpt4 key购买 nike

我正在开发一个基于 Java 的二进制数据下载器。此数据通过基于文本的协议(protocol)(UU 编码)传输。对于网络任务,使用了 netty 库。二进制数据由服务器拆分成数千个小数据包并发送到客户端(即 Java 应用程序)。

每次收到新消息(数据)时,我都会从 netty 收到一个 ChannelBuffer 对象。现在我需要处理这些数据,除了其他任务外,我还需要检查来自服务器的包的 header (比如 HTTP 状态行)。为此,我调用 ChannelBuffer.array() 来接收一个 byte[] 数组。然后我可以通过 new String(byte[]) 将这个数组转换为字符串,并轻松检查(例如比较)它的内容(同样,比如与 HTTP 中的“200”状态消息进行比较)。

我正在编写的软件使用多线程/连接,因此我可以并行地从 netty 接收多个数据包。

这通常工作正常,但是,在分析应用程序时我注意到,当与服务器的连接良好并且数据传入速度非常快时,到 String 对象的转换似乎是一个瓶颈。在这种情况下,CPU 使用率接近 100%,根据分析器,调用此 String(byte[]) 构造函数花费了很多时间。

我搜索了一种从 ChannelBufferString 的更好方法,并注意到前者也有一个 toString() 方法.但是,该方法比 String(byte[]) 构造函数还要慢。

所以我的问题是:你们中有谁知道实现我正在做的事情的更好选择吗?

最佳答案

或许您可以完全跳过字符串转换?您可以让常量保存比较值的字节数组,并检查数组到数组而不是字符串到字符串。

这里有一些快速代码来说明。目前你正在做这样的事情:

String http200 = "200";
// byte[] -> String conversion happens every time
String input = new String(ChannelBuffer.array());
return input.equals(http200);

也许这样更快:

// Ideally only convert String->byte[] once.  Store these
// arrays somewhere and look them up instead of recalculating.
final byte[] http200 = "200".getBytes("UTF-8"); // Select the correct charset!
// Input doesn't have to be converted!
byte[] input = ChannelBuffer.array();
return Arrays.equals(input, http200);

关于Java:比 String(byte[]) 更快的替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19326028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com