0

Android Profilerツールを使用していると、コードのパフォーマンスが重要な領域で大量のByteBufferを使用していることがわかりました。私は可能な限り最大のパフォーマンスヒットの最適化に取り組んできました(まだループ最適化のようなものに行くことを余儀なくされていません)、そしてByteBufferコードはそれが別の/より良い解決策に簡単に置き換えることができるように見えます。

問題:ByteBufferストリームにある4つの連続したバイトからintを取得します。これは、任意の長さで、現在(以下で、具体的には// <<<パーツを参照)一時ByteBufferで実行され、intを形成するために必要なバイトを取得します。もっと簡単なプロセスはありますか?

private int peekStreamData(ByteBuffer stream, int count) {
    int data = 0;
    int stream_field = streamField;
    int stream_field_bit_index = streamFieldBitIndex;
    byte[] streamArr = stream.array();
    ByteBuffer bb = ByteBuffer.allocate(4);
    while (count > (32 - stream_field_bit_index) && streamIndex < (imageStream.capacity() >> 2)) {
        data = (data << (32 - stream_field_bit_index)) | ( stream_field >>> stream_field_bit_index);
        count -= 32 - stream_field_bit_index;

        bb.put(0,streamArr[streamIndex * 4 + 3]);  //<<<
        bb.put(1,streamArr[streamIndex * 4 + 2]);  //<<<
        bb.put(2,streamArr[streamIndex * 4 + 1]);  //<<<
        bb.put(3,streamArr[streamIndex * 4 + 0]);  //<<<
        stream_field = bb.getInt();                //<<<        
        stream_field_bit_index = 0;
    }
    if (count > 0)
        data = (data << count) | (stream_field >>> (32 - count));
    return data;//data;
}

間違いがあればお気軽にご指摘ください。私はごく最近までByteBuffersを使ったことがなく、学びたいと思っています。

4

3 に答える 3

2

これらの行

    bb.put(0,streamArr[streamIndex * 4 + 3]);  //<<<
    bb.put(1,streamArr[streamIndex * 4 + 2]);  //<<<
    bb.put(2,streamArr[streamIndex * 4 + 1]);  //<<<
    bb.put(3,streamArr[streamIndex * 4 + 0]);  //<<<
    stream_field = bb.getInt();                //<<<

2番目のByteBufferで次のように置き換えることができます。

    stream_field = stream.getInt(streamIndex * 4);

他のコードの多くは単純化できると思いますが、それが何をするのか、なぜそれを行うためのループさえあるのかは私にはわかりません。

于 2011-07-08T22:50:53.643 に答える
1

やってみました:

stream_field = (streamArr[streamIndex * 4 + 0] & 0xFF) | ((streamArr[streamIndex * 4 + 1] & 0xFF) << 8) | ((streamArr[streamIndex * 4 + 2] & 0xFF) << 16) | ((streamArr[streamIndex * 4 + 3] & 0xFF) << 24);

また:

stream_field = ((streamArr[streamIndex * 4 + 0] & 0xFF) << 24) | ((streamArr[streamIndex * 4 + 1] & 0xFF) << 16) | ((streamArr[streamIndex * 4 + 2] & 0xFF) << 8) | (streamArr[streamIndex * 4 + 3] & 0xFF);

エンディアンによって異なります。

編集:Javabyteでは署名されているため、マスキングが必要です。修正しました。

于 2011-07-08T22:23:31.607 に答える
0

一時的なByteBufferを使用する代わりに、4バイトをintに結合することができます。デフォルトでは、4バイトはビッグエンディアンのバイトオーダーです。また、「streamIndex*4」を4回続けて計算する必要はありません。

于 2011-07-08T22:15:40.457 に答える