При переходе с языка программирования Delphi на Java может возникнуть необходимость переноса функционала, связанного с работой с файлами и массивами данных. В частности, в Delphi для чтения массива байтов в массив чисел с плавающей точкой используется процедура BlockRead, которая позволяет обращаться к бинарному файлу случайным образом. В Java аналогичный функционал может быть не столь очевиден, и возникает вопрос о скорости выполнения операций.
Проблема
В Delphi для чтения массива байтов в массив Single (числа с плавающей точкой) используется следующий подход:
TSingleArray = Array[0..MAXSIZE] of Single;
...
procedure GetLinkValues(const LinkVar: Integer; const TimePeriod: Integer; var Value: PSingleArray);
...
BlockRead(Fout, Value^, Nlinks*SizeOf(Single));
В Java для аналогичной задачи используется цикл, который может вызвать опасения по поводу производительности:
List<Float> l = new ArrayList<Float>();
...
for (int i = 0; i < nLinks; i++)
l.add(resultsFile.readFloat());
Решение
Для ускорения чтения массивов байтов в числа с плавающей точкой в Java можно использовать FloatBuffer. Это позволяет выполнить операцию чтения блока данных без необходимости явного перебора элементов в цикле. Пример использования FloatBuffer для чтения данных из файла:
byte[] bt = new byte[nLinks * 4];
List<Float> l = new ArrayList<Float>();
// ... (предыдущий код для позиционирования в файле)
// Чтение байтов в массив
resultsFile.read(bt, 0, nLinks * 4);
// Создание ByteBuffer и обертка в FloatBuffer
ByteBuffer bb = ByteBuffer.wrap(bt);
bb.rewind();
FloatBuffer fb = bb.asFloatBuffer();
// Чтение из FloatBuffer в массив значений
fb.get(values);
Подтверждение эффективности
Автор вопроса провел профилирование кода и обнаружил, что использование FloatBuffer значительно ускоряет процесс чтения данных из файла по сравнению с обычным циклом. В частности, время чтения для большого файла составило всего 0 миллисекунд для ByteBuffer, в то время как использование List<float> заняло 140 миллисекунд. После преобразования ByteBuffer в массив, время итерации составило 16 миллисекунд, что подтверждает эффективность подхода.
Заключение
Переход с Delphi на Java может потребовать изменения подходов к работе с файлами и массивами данных. Использование FloatBuffer в Java позволяет достичь производительности, аналогичной использованию BlockRead в Delphi, и может быть предпочтительным решением для задач, требующих высокой скорости чтения данных из файла.
Переход с Delphi на Java для ускорения чтения массивов байтов в формат Single (числа с плавающей точкой) требует использования `FloatBuffer` для повышения производительности, что подтверждено профилированием кода.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.