У меня есть простая программа, которая читает кучу вещей из файловой системы, фильтрует результаты и печатает их. Эта простая программа реализует язык, специфичный для домена, для облегчения выбора. Это 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
Согласно «Dragon Book», выбирая наилучший порядок выполнения трех адресов кода является NP-полной задачи (по крайней мере, в соответствии с страница 511 второго издания этого текста), но в этом случае речь идет о распределении регистров и других проблемах машины. В моем случае фактический «промежуточный код» намного проще. Мне интересно, существует ли схема, которая позволила бы мне переупорядочить исходный IL в оптимальный план выполнения.
Вот еще один пример:
{C: \ Windows \ Inf * И -ТП} ИЛИ {-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
Я не вижу большой проблемой здесь. Почему вы не можете строго заказать все по своей «эссе» стоимости? – strager
@Neil: Я думаю, это не связано с C++. Удаление тега. @strager: Err ... если вы просто сортируете, вы измените значение выражения. –
Ах, я неправильно понял. Диаграмма @ Грега Хьюджилла помогла мне понять. – strager