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.

Спасибо, С уважением,

Marek

+4

Включите эти два блока в методы, напишите несколько тестов и сравните производительность. Зачем полагаться на мнения других людей, когда вы можете получить точные результаты? –

ответ

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) ((l & 0x000000FF) >> 0)' такой же как '(byte) l';) –

+0

@Peter, ah ;-) nice – aioobe