バイナリ データ用の Java ベースのダウンローダーを開発しています。このデータは、テキストベースのプロトコル (UU エンコード) を介して転送されます。ネットワーク タスクにはnettyライブラリが使用されます。バイナリ データはサーバーによって何千もの小さなパケットに分割され、クライアント (つまり Java アプリケーション) に送信されます。
nettyからChannelBuffer
は、新しいメッセージ (データ)を受信するたびにオブジェクトを受け取ります。次に、そのデータを処理する必要があります。他のタスクに加えて、サーバーからのパッケージのヘッダー (HTTP ステータス行など) を確認する必要があります。そのために、配列ChannelBuffer.array()
を受け取るために呼び出します。byte[]
次に、この配列を文字列に変換し、new String(byte[])
その内容を簡単に確認 (比較など) できます (ここでも、HTTP の「200」ステータス メッセージとの比較のように)。
私が書いているソフトウェアは複数のスレッド/接続を使用しているため、nettyから複数のパケットを並行して受信します。
String
これは通常は問題なく動作しますが、アプリケーションのプロファイリングを行っているときに、サーバーへの接続が良好でデータが非常に高速に受信されると、このオブジェクトへの変換がボトルネックのように見えることに気付きました。String(byte[])
このような場合、CPU 使用率は 100% 近くになり、プロファイラーによると、このコンストラクターの呼び出しに非常に多くの時間が費やされます。
から に到達するためのより良い方法を検索したところChannelBuffer
、String
前者にもtoString()
方法があることに気付きました。ただし、そのメソッドはString(byte[])
コンストラクターよりもさらに低速です。
だから私の質問は:あなたの誰かが私がやっていることを達成するためのより良い代替手段を知っていますか?