【发布时间】:2017-05-27 08:51:32
【问题描述】:
假设我们在某种抽象编程语言中有以下代码-sn-p:
map<string, int> user_settings;
//somewhere at run-time user_settings are populated
for(i=0; i < 1000000000000; i++) {
if (user_settings["do_stuff"] == 1) { do some stuff... }
else { do other stuff }
}
这里的问题是,我们会在一些事情的运行时在循环内做很多负载,即“运行时常量”(即用户设置的某个值)。有可能通过立即加载提供价值,甚至完全优化无用的分支并仅使用所需的 then-else-branch 代码。
是否有执行此类优化的系统/编程语言/jit 编译器?我能找到的唯一相关工作是某个 MIT 家伙的论文:http://groups.csail.mit.edu/cag/rio/josh-meng-thesis.pdf
PS 我不是要优化 this em> 代码。我知道,您可以预先加载该值,该值将加载到本地寄存器中。在某些情况下,您无法手动执行此类“优化”。
【问题讨论】:
-
甚至不需要结果是“运行时常量”——重要的是循环体不会改变它。对于每个优化器来说,将这种不变的评估从循环中移出几乎是标准的。
-
@Holger 你能提供例子吗?因为据我所知,只有 CS 研究 jit 编译器可以做到这一点,但没有生产就绪语言
-
我不确定您认为哪种优化是一个障碍。认识到表达式是循环不变的,需要对其代码进行内联,这就是为什么要积极执行内联,例如在JVM内部。其余的是最先进的,例如The Hotspot whitepaper 说“优化器执行所有经典优化,包括死代码消除、循环不变提升、公共子表达式消除、常量传播、全局值编号和全局代码运动”...
-
好吧,也许你已经假设这是不可能的。但是通过一些别名分析来确保
user_settings["do_stuff"]只在循环内被访问而不是在循环内修改,结合循环不变的代码运动应该把它拉出循环。这是一个非常常见的优化。
标签: optimization compiler-construction compiler-optimization jit trace