Почему RandomAccessFile writeLong реализован с несколькими вызовами записи?

При профилировании приложения я заметил, что RandomAccessFile.writeLong занимает много времени.

Я проверил код этого метода, и он включает восемь вызовов собственного метода write. writeLong занимал много времени. Я проверил код этого метода, и он включает восемь вызовов собственного метода write. Я ...

При профилировании приложения я заметил, что RandomAccessFile.writeLong занимает много времени.

Я проверил код этого метода, и он включает восемь вызовов собственного метода write. writeLong занимал много времени. Я проверил код этого метода, и он включает восемь вызовов собственного метода write. Я ...

При профилировании приложения я заметил, что RandomAccessFile.writeLong занимает много времени.

Я проверил код этого метода, и он включает восемь вызовов собственного метода write. Я написал альтернативную реализацию writeLong с использованием байта []. Примерно так:

RandomAccessFile randomAccessFile = new RandomAccessFile("out.dat", "rwd");
...
byte[] aux = new byte[8];
aux[0] = (byte) ((l >>> 56) & 0xFF);
aux[1] = (byte) ((l >>> 48) & 0xFF);
aux[2] = (byte) ((l >>> 40) & 0xFF);
aux[3] = (byte) ((l >>> 32) & 0xFF);
aux[4] = (byte) ((l >>> 24) & 0xFF);
aux[5] = (byte) ((l >>> 16) & 0xFF);
aux[6] = (byte) ((l >>> 8) & 0xFF);
aux[7] = (byte) ((l >>> 0) & 0xFF);
randomAccessFile.write(aux);

Я провел небольшой тест и получил следующие результаты:

Используя writeLong ():
Среднее время вызова: 91 мс

Использование записи (byte []):
Среднее время вызова: 11 мс

Тестовый запуск на машине Linux с процессором Intel (R) T2300 @ 1,66 ГГц

Поскольку собственные вызовы имеют некоторое снижение производительности, почему writeLong реализован таким образом? Я знаю, что этот вопрос следует задать ребятам из Sun, но я надеюсь, что у кого-то здесь есть подсказки.

Спасибо.

5
задан jassuncao 21 April 2011 в 10:44
поделиться