通过jit-compiling值立即优化远程内存负载

时间:2017-01-12 09:53:09

标签: optimization compiler-construction compiler-optimization jit tracing

假设我们在一些抽象编程语言中有以下代码片段:

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 }
}

这里的问题是我们会在某些事情的运行时在循环内做很多加载,即&#34;运行时常量&#34; (即,用户设置的某些值)。有可能通过立即加载提供价值,甚至可以完全优化无用的分支,只使用所需的代码 - else-branch。 是否有执行此类优化的系统/编程语言/ jit编译器?我能找到的相关工作只是麻省理工学院的一些人的论点:http://groups.csail.mit.edu/cag/rio/josh-meng-thesis.pdf
P.S。 我不是要求优化 代码。我知道,您可以预先加载该值,该值将加载到本地寄存器。有时情况下,您无法执行此类优化&#34;用手。

2 个答案:

答案 0 :(得分:0)

一个好的编译器优化步骤 可能 预加载并测试字典中的“do stuff”并将迭代全部放在一起。如果它可以确定没有副作用会改变字典中“do stuff”的值,它会这样做。

如果您正在编写自己的编译器,那么有大量的优化技术。当然,根据您是在开发一种命令式语言还是功能性以及与它们一起使用的tenets,它们会有所不同。

例如,在大多数函数式语言中,我确信大多数模块声明的数据类型(列表,集合,映射)的内容不会随着时间的推移而发生变化(持久性)。在某些情况下,这些语言支持副作用或变异功能,在这种情况下,您的优化也必须考虑这一点。

答案 1 :(得分:0)

例如,动态链接器中使用的一种简洁方法在这里可能很有用:

让您的编译器生成动态代码,以便知道谁调用它。

这样,如果动态代码发现它收到的数据永远不会改变,它只能在呼叫站点重写代码。因此,它不是CALL get_user_setting "do_stuff"而是用PUSH int 1或其他任何内容替换指令,也可能用一些NOP来填充CALL指令的大小。

动态链接器经常这样做。第一次尝试调用动态链接函数时,它们实际上会跳转到加载器。它加载实际函数,然后重写CALL指令,使其调用加载的函数而不是例程来加载函数。任何未来的电话都不必再次进行查询。 (我在博客上发表了这篇文章here