Интересно об эффективности поиска
В настоящее время я изучаю структуру PE. Я пытаюсь разобрать это с помощью Perl вместо C.
Это не важно, но если вы читаете бинарный файл, вам нужно перейти к определенному разделу. (Например, прочитать e_lfanew)
Я хочу прочитать данные в точке 0x78, которая читается $buf с данными 0x200.
Вот два способа, которыми я думал, чтобы извлечь данные в 0x78.
my ($ dummy, $ data) = unpack ("A0x78 A*", $buf);
or
seek (F, 0x78,0); read F, $buf, 0x200; print ~
Я хочу знать, какой из этих двух методов более эффективен, чем вычитание фиктивных данных и чтение данных и чтение новых данных посредством поиска.
1 ответ
Минимальная единица хранения диска называется сектором. Для жестких дисков они обычно имеют размер 512 байт (хотя вы также можете найти диски с секторами 4096 байт).
Ваш файл охватывает два сектора.
000 078 200 278 400
+--------------+--------------+---...
| ****************
+--------------+--------------+---...
А поскольку блок интересов частично находится в первом секторе, то оба описанных вами подхода должны будут прочитать одинаковое количество секторов.
Поскольку на самом деле чтение данных с диска является медленной частью, между этими двумя подходами нет реальной разницы.
О, но вы буферизуете IO вместо использования sysread
, При использовании буферизованного ввода-вывода (например, read
), Perl читает из ОС в 4 кБ или 8 кБ (в зависимости от вашей версии Perl). Таким образом, 8 или 16 секторов загружаются с диска, если вы начинаете чтение с позиции 0, и 9 или 17 секторов загружаются с диска, если вы seek
первый. Так что, пытаясь читать меньше, вы на самом деле читаете больше!
Тем не менее, разница достаточно мала, чтобы разница в скорости была потеряна из-за шума.