вторник, 9 ноября 2010 г.

Байтовые преобразования

Возникла стандартная задача преобразовать примитивный тип данных (дабл, лонг и т.д.) в массив байт (грубо говоря сериализовать). И конечно же джава как всегда предлагает нам УМЛ диаграммы даже для такой тривиальной херни. Поэтому пришлось потратить время, чтобы изучить три варианта решения (доступные out-of-the-box в джаве) и узнать какой из них лучше.

 1. Первый вариант, который активно советуют везде и который самый отстойный, - использование поточных классов: ByteArrayOutputStream, обернутый в DataOutputStream. Инстансы поточных классов мы конечно же не создаем каждый раз, но это все равно не спасает
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
...
dos.writeDouble(d);
byte[] result = bos.toByteArray();

 2. Вариант второй - использовать появившийся в Java 1.5 (и оставшийс поныне) годный класс ByteBuffer.
ByteBuffer bb = ByteBuffer.allocate(8);
bb.putDouble(d);
byte[] result = bb.array();

 3. Третий вариант - выполнять все побитово-байтовые операции ручками. Изучать представление дабла было в лом, проверил его лишь для лонга.

Результаты затрачиваемого времени следующие:
Поточный способ : Способ с ByteBuffer : Ручной способ  =  3.42 : 1.37 : 1

Никто и не сомневался, что ручной способ будет быстрее всех. но неожиданной стала большая разница времени выполнения между байтбуфером и поточными классами.
Disclaimer! Тесты были выполнены без надлежащей подготовки, самым что ни на есть кустарным образом, и результаты нельзя трактовать абсолютным образом.