2011-02-10 4 views
3

私のアルゴリズムの一部について意見やアドバイスをお願いしたいと思います。プリミティブをキャストするかバイト単位にトリミングするか

ByteBuffer bb = ByteBuffer.allocate(8); 
bb.putLong(rs.getLong(index));//retrieve long from db (unsigned INT) 
byte[] tmp = new byte[4]; 
bb.position(4); 
bb.get(tmp); 
(Inet4Address) InetAddress.getByAddress(tmp); 

ByteBuffer bb = ByteBuffer.allocate(4); 
bb.putInt((int) rs.getLong(index));//retrieve long from db (unsigned INT) 
bb.flip(); 
byte[] tmp = new byte[4]; 
bb.get(tmp); 
(Inet4Address) InetAddress.getByAddress(tmp); 

基本的に私はそこにパフォーマンスの違いが鋳造であるか、それは大きなのByteBufferを使用する方がよいかどうかを知っていただきたいと思います。

おかげで、よろしく、

マレク

+4

これら2つのブロックをメソッドに囲み、いくつかのテストを記述してパフォーマンスを比較します。あなたは正確な結果を得ることができるときに他の人の意見に頼るのはなぜですか? –

答えて

3

は基本的に私はそこにパフォーマンスの違いが鋳造であるか、それは大きなのByteBufferを使用する方がよいかどうかを知っていただきたいと思います。

キャストは、新しいByteBufferを割り振り、いくつかのメソッドを呼び出すのと比べると特に安いです。

私はあなたが何をしようとしているかは完全には分かっていませんが、単純なシフト権はそのトリックをするでしょうか?たとえば、次のコードスニペットを使用します。

long l = rs.getLong(index); 
InetAddress.getByAddress(new byte[] { (byte) ((l & 0xFF000000) >> 24), 
             (byte) ((l & 0x00FF0000) >> 16), 
             (byte) ((l & 0x0000FF00) >> 8), 
             (byte) ((l & 0x000000FF) >> 0)}); 
+0

+1 '' ByteBuffer'を作成して 'int 'を' byte [4]に変換することは、パフォーマンス面では面倒です。 –

+1

BTW '(byte)((1&0x000000FF)>> 0)'は(byte)l'と同じです) –

+0

@Peter、ah ;-) nice – aioobe

関連する問題