【发布时间】:2010-08-02 15:56:30
【问题描述】:
我有一个简单的程序,它从文件系统中读取一堆东西,过滤结果,然后打印出来。这个简单的程序实现了一种特定领域的语言,使选择更容易。这个 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 } OR { -tf AND NOT 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
【问题讨论】:
-
我认为这里没有太大问题。为什么不能按照“成本”启发式严格排序?
-
@Neil:我想这与 C++ 无关。移除标签。 @strager:呃……如果你只是排序,那么你会改变表达式的含义。
-
啊,我误会了。 @Greg Hewgill 的图表帮助我理解了。
标签: language-agnostic optimization compiler-construction query-optimization