Интересно об эффективности поиска

В настоящее время я изучаю структуру 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 первый. Так что, пытаясь читать меньше, вы на самом деле читаете больше!

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

Другие вопросы по тегам