0

私はバイトごとにデータを読んでいます。メッセージ全体があると判断したら、それを文字列として別の関数に渡す必要があります。一部のメッセージは非常に大きくなる可能性がありますが、サイズは頻繁に異なります。どの実装が最も効率的だと思いますか。

public test class
{
   char[] buffer = new char[MAX_SIZE_7200];
   int bufferIndex = 0;
   void parseData(ArrayList<Byte> msg, length)
   {
       while (!msg.isEmpty())
       {
          buffer[bufferIndex++] = (char) msg.remove(0);
          if (isfullmessage)
          {
             parseData(new String(buffer, 0, bufferIndex);
             bufferIndex = 0;  //restart and continue parsing data
          }
       }
   }
 }

また:

public test class
{
   List<Character> buffer = new ArrayList<Character>();
   int bufferIndex = 0;
   void parseData(ArrayList<Byte> msg, length)
   {
       while (!msg.isEmpty())
       {
          buffer.add((char) msg.remove(0));
          if (isfullmessage)
          {
              StringBuilder builder = new StringBuilder(buffer.size());
              for (Character ch: buffer)
              {
                  builder.append(ch);
              }
              parseData(builder.toString());
              buffer.clear();
          }
       }
   }
 }  

また:

public test class
    {
       StringBuilder buffer = new StringBuilder();
       int bufferIndex = 0;
       void parseData(ArrayList<Byte> msg, length)
       {
           while (!msg.isEmpty())
           {
              buffer.append((char) msg.remove(0));
              if (isfullmessage)
              {                  
                  parseData(builder.toString());
                  buffer.clear();  //some stringbuilder clear function
              }
           }
       }
     }  

または、より効率的な方法がありますか。完全なメッセージを含まないデータを処理する可能性があり、完全なメッセージを取得して処理するために関数を複数回実行する可能性があるため、完成したメッセージを関数の範囲外に保持する変数があることに注意してください。

4

3 に答える 3

9

StringBuilderを使用します。一度に1文字ずつ追加することをサポートし、必要に応じて容量を拡張し、再利用のためにリセットすることができます。

于 2012-12-12T18:58:53.563 に答える
0

これはあなたのメッセージの平均的な長さに依存すると思います。より「完全な」メッセージの場合、その要素タイプなので、charがより適切な選択になります

スパースの場合、オブジェクトプレゼンテーションのオーバーヘッドにもかかわらず、メモリ消費量が少なくなるため、リストテンプレートの方が優れています。

于 2012-12-12T19:00:27.680 に答える
0

ループ内のこのArrayListの最初の要素を削除することにより、ArrayListmsgの要素を反復処理しています。ArrayListは、そのすべての要素を配列に格納します。配列内のすべての要素(最初の要素を除く)をコピーする必要があるため、最初の要素の削除には時間がかかります。

したがって、最大のオーバーヘッドは、配列に文字を設定したり、StringBuilderに文字を追加したりすることではないかもしれませんが、msg.remove(0)を繰り返し呼び出すことである可能性があります。

これを使用してこれを修正できます:

int index = 0;
while (index < msg.length()) {
    buffer[bufferIndex++] = (char) msg.get(index);
    index++;
    // etc.
}
于 2012-12-15T11:05:26.227 に答える