При профилировании приложения я заметил, что 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, но я надеюсь, что у кого-то здесь есть подсказки.
Спасибо.