У меня есть простая программа, которая читает кучу вещей из файловой системы, фильтрует результаты и печатает их. Эта простая программа реализует предметно-ориентированный язык для облегчения выбора. Этот DSL «компилируется» в план выполнения, который выглядит следующим образом (входные данные были C:\Windows\System32\* OR -md5"ABCDEFG" OR -tf
):
Index Success Failure Description
0 S 1 File Matches C:\Windows\System32\*
1 S 2 File MD5 Matches ABCDEFG
2 S F File is file. (Not directory)
Фильтр применяется к данному файлу, и в случае успеха указатель индекса переходит к индексу, указанному в поле успеха, и, если он не работает, указатель индекса переходит к числу, указанному в поле сбоя. «S» означает, что файл проходит фильтр, F означает, что файл должен быть отклонен.
Конечно, фильтр, основанный на простой проверке атрибута файла (! FILE_ATTRIBUTE_DIRECTORY), работает намного быстрее, чем проверка, основанная на MD5 файла, которая требует открытия и выполнения фактического хэша файла. Каждый фильтр «код операции» имеет связанный с ним временной класс; MD5 получает высокий временный номер, ISFILE получает низкий временный номер.
Я хотел бы изменить порядок выполнения, чтобы коды операций, которые занимают много времени, выполнялись как можно реже. Для приведенного выше плана это будет означать, что оно должно быть:
Index Success Failure Description
0 S 1 File is file. (Not directory)
1 S 2 File Matches C:\Windows\System32\*
2 S F File MD5 Matches ABCDEFG
Согласно «Книге Дракона», выбор наилучшего порядка исполнения для трех адресов является проблемой NP-Complete (по крайней мере, в соответствии со страницей 511 второго издания этого текста), но в этом случае они говорят о распределении регистров и других вопросах машины. В моем случае фактический «промежуточный код» намного проще. Мне интересно, существует ли такая схема, которая позволила бы мне переупорядочить исходный IL в оптимальный план выполнения.
Вот еще один пример:
{C: \ Windows \ Inf * AND -tp} ИЛИ {-tf И НЕ C: \ Windows \ System32 \ Drivers *}
Разобрано до:
Index Success Failure Description
0 1 2 File Matches C:\Windows\Inf\*
1 S 2 File is a Portable Executable
2 3 F File is file. (Not directory)
3 F S File Matches C:\Windows\System32\Drivers\*
что оптимально:
Index Success Failure Description
0 1 2 File is file. (Not directory)
1 2 S File Matches C:\Windows\System32\Drivers\*
2 3 F File Matches C:\Windows\Inf\*
3 S F File is a Portable Executable