2

ソケットから (TCP プロトコルを介して) メッセージを読み取っていますが、CPU が BufferedInputStream の available() メソッドを呼び出すのに多くの時間を費やしていることに注意してください。これは私のコードです:

    @Override
public void run()
{

    Socket socket;
    Scanner scanner;
    BufferedInputStream buffer = null;

    try
    {
        socket = new Socket(SERVER_HOST, SERVER_PORT);

        System.out.println("Connection Completed");

        InputStream inputStream = socket.getInputStream();
        buffer = new BufferedInputStream(inputStream);

        StringBuilder readCharacter;

        while (true)
        {

            readCharacter = new StringBuilder();
            try
            {

                while (buffer.available() > 0)
                {
                    readCharacter.append((char) buffer.read());
                }

            }
            catch (IOException e)
            {
                e.printStackTrace();
                buffer.close();
            }

            String array[] = separe(new String(readCharacter));
         ... //parsing the message

read=buffer.read()また、利用可能な関数を使用する代わりに intと checkを使用しようとしましif (read!=-1)たが、この場合、メッセージの終わりを認識できません...私の StringBuilder 'readCharacter' には、複数のメッセージがあります。他の後..そしてそれは私の解析プロセスの失敗を引き起こします...

available()チェックを使用する代わりに、readCharacter一度に1つのメッセージしかありません..そして解析が機能します...

その理由と、CPU の消費を回避する方法を理解するのを手伝ってもらえますか?

4

2 に答える 2

3

このループ:

while (buffer.available() > 0)
  {
  readCharacter.append((char) buffer.read());
  }

シンプルに置き換えることができます:

readCharacter.append((char) buffer.read());

ノンブロッキングavailable()を何度も呼び出す (多くの CPU を消費する)代わりに、read()何かが利用可能になるまで CPU を消費しないブロックを呼び出すだけです。これは、より少ないコードと複雑さで達成したいことのようです。

于 2011-11-21T09:17:25.433 に答える
1

自体はavailable()CPU を消費しません。あなたのループは何ですか:

while (buffer.available() > 0) {
    readCharacter.append((char) buffer.read());
}

バイトが利用できない間、実際にはavailable()複数回 (おそらく数千回) 呼び出しています。ストリームのメソッドがブロックされているためread()、呼び出す必要はまったくありませんavailable()。次のコードは同じことを行いますが、CPU を消費しません。

String line = null;
while ((line = buffer.read()) != null) {
    readCharacter.append(line);
}
于 2011-11-21T09:19:21.867 に答える