Интересно об эффективности поиска - PullRequest
0 голосов
/ 16 февраля 2019

Я сейчас изучаю структуру 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 Ответ

0 голосов
/ 16 февраля 2019

Минимальная единица хранения диска называется сектор .Для жестких дисков они обычно имеют размер 512 байт (хотя вы также можете найти диски с секторами 4096 байт).

Ваш файл занимает два сектора.

000  078       200   278      400
+--------------+--------------+---...
|    ****************
+--------------+--------------+---...

И поскольку блокИнтерес частично к первому сектору, одинаковое количество секторов должно быть прочитано обоими подходами, которые вы описали.

Поскольку чтение данных с диска - это медленная часть, реальной разницы между ними нет.два подхода.


О, но вы используете буферизованный ввод-вывод вместо использования sysread.При использовании буферизованного ввода-вывода (например, read) Perl считывает данные из операционной системы порциями по 4 КиБ или 8 КиБ (в зависимости от вашей версии Perl).Таким образом, 8 или 16 секторов загружаются с диска, если вы начинаете чтение с позиции 0, и 9 или 17 секторов загружаются с диска, если вы сначала seek.Таким образом, пытаясь читать меньше, вы на самом деле читаете больше!

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

...