云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

中间件_什么是web服务器_新注册优惠

小七 141 0

帮助LuaJIT更快

这是劳伦斯·特拉特的客座帖子,他是伦敦国王学院信息学系软件开发的程序员和读者,他领导软件开发团队。他也是EPSRC的成员。编程语言虚拟机(vm)是我们熟悉的野兽:我们用它们在手机上运行应用程序,在浏览器中运行代码,在服务器上运行程序。传统的vm是有用的并且被广泛使用:几乎每个工作的程序员都熟悉一个或多个"标准"Lua、Python或Ruby vm。然而,这种vm过于简单,只包含一个解释器(一种语言的简单实现)。它们通常不能以我们需要的速度运行我们的程序;而且,即使可以,它们也常常浪费大量的服务器CPU时间。我们有时会忘记,服务器消耗了世界上大量且不断增长的电能输出:缓慢的语言实现实际上正在改变世界,而且不是一个好的方式。更高级的vm带有即时(Just-In-Time,JIT)编译器(众所周知的例子包括LuaJIT、HotSpot(又名"JVM")、PyPy和V8)。经常把VMs的代码编译成一个执行的程序。当这项工作正常时,它会导致显著的加速(2x-10x是常见的;100x不是未知的)。我们都想让这些虚拟机比现在更好,但这样做说起来容易做起来难。在内部,带有JIT编译器的vm是极其复杂的野兽,有许多活动部件以微妙的方式交互,这很难解释。例如,当VM被优化后,错误代码就不再是一个有用的例子了。你有没有想过如何分离内联函数的堆栈?也许这听起来很简单。当内联允许JIT编译器删除内存分配时会发生什么:应该如何标识"丢失的"分配并"恢复"?即使在虚拟机的这一部分,其复杂性也很快变得令人难以置信。这和Cloudflare或我有什么关系?好吧,正如你们中的许多人所知,Cloudflare是LuaJIT的大量用户,他们希望LuaJIT的性能比现在更好。尽管Cloudflare的开发人员对LuaJIT有很深的了解,但他们一直希望能给开源社区更多的回报。不幸的是,至少可以说,找到一个能够并且愿意从事如此复杂的项目的人并不容易。我建议我们的研究小组——伦敦国王学院的软件开发团队——可能会提供一条富有成效的替代途径。令人高兴的是,Cloudflare同意了,并为一个项目提供了资金,该项目从8月底开始,旨在改善LuaJIT的性能。为什么是我们的团队?好吧,部分原因是我们做了大量的虚拟机工作,从数据结构优化到语言组合,再到基准测试,这有助于我们让新接触该领域的人快速入门和运行。部分原因,我喜欢思考,因为我们对作为研究一部分的项目持开放态度。虽然我们没有做过大量的LuaJIT直接研究,但我们一直试图跟上它的发展(例如,我们邀请Vyacheslav Egorov在我们2016年开办的VM暑期学校谈论LuaJIT),我们经常将其作为跨VM基准测试的关键部分。就我个人而言,LuaJIT已经知道很多年了:我在2012年提交了一个非常非常小的补丁,让它在OpenBSD上运行,这样我就可以试用这个我听别人大赞过的虚拟机;我在一个小玩具项目中使用了LuaJIT的聪明的组装系统;我已经将LuaJIT包含在不止一个基准测试套件中(例如本文)。我的第一印象是LuaJIT有一个惊人的小代码库和惊人的快速预热(粗略地说,从程序开始到最终生成机器代码的时间)。这两点在今天仍然是正确的,并且证明了mikepall的远见和编码能力。然而,将LuaJIT与其他vm进行对比已经显示出了一些弱点,我逐渐意识到,在大型系统上使用LuaJIT的人都知道这些弱点。简而言之,较大的程序在每次运行时都会表现出明显的性能差异,而且有些程序在长时间内的运行速度不如其他vm所能达到的速度。我不认为这是一种批评——我熟悉的每一个虚拟机都有优点和缺点——而是一个机会,看看我们是否能把事情做得更好。我们要如何着手改进LuaJIT?首先,我们有一个你通常只能梦到的运气:在与一些友好的LuaJIT内部人士交谈后,我非常幸运地邀请了LuaJIT专家Thomas Fransham与我们在King's合作。Tom对LuaJIT内部结构的深刻理解意味着我们有一个可以立即将想法变为现实的人。第二,我们正在利用我们多年来在虚拟机基准测试方面的工作,最近随着虚拟机的热身和冷纸以及Krun和Warmup_统计系统的发展,这项工作终于迎来了曙光。简而言之,我们发现,即使在理想化的环境中,广泛研究的基准测试通常也不会像在著名的vm上那样热身。有时随着时间的推移,它们会变慢;有时,它们永远不会稳定下来;有时它们在一次执行到下一次执行时不一致。即使在最好的情况下,我们发现,在我们所研究的所有虚拟机中,只有43.5%的病例像预期的那样预热(51%的情况下,LuaJIT比一些虚拟机好一点)。虽然这对我们这些开发vm的人来说有点尴尬,但它迫使我提出两个假设(这是"直觉"的一个花哨的词),我们将在本项目中测试:vm具有启发式(例如,"何时编译代码"),它们以我们不再理解的方式交互;而且,在更改之前和之后进行严格的基准测试(无论这些更改是添加还是删除代码)是使性能更好、更可预测的唯一方法。正如这可能表明的那样,我们的目标并不是"仅仅"改善LuaJIT。这个项目自然也会帮助我们推进我们更广泛的研究兴趣,集中在理解如何提高虚拟机性能。我希望,从长远来看,我们从LuaJIT中学到的东西也将有助于其他vm的改进。事实上,我们对下一代vm可能是什么样子有着很好的想法,我们一定会从这个项目中吸取重要的经验教训。我们的长期赌注是在元跟踪上:我们认为,通过结合英特尔新推出的处理器跟踪功能和其他一些我们袖手旁观的技巧,我们可以降低它目前可怕的预热成本。这就为类似并行编译之类的事情开辟了新的可能性,而这些事情以前并不被认为是值得的。虽然LuaJIT不是一个元跟踪JIT编译器,但它是一个跟踪JIT编译器,正如它的名称所示,大多数概念都是从一个概念传递到另一个概念。要说我非常感谢Cloudflare的支持是轻描淡写的。从外部看,这可能并不明显,但(除了我之外)我们研究小组的每个人都得到了外部资金的支持:没有资金,我就无法支付像汤姆这样的好人来帮助推动这一课题的进展。我还很高兴地说,在我问之前,Cloudflare明确表示,他们希望项目的所有结果都是公开的。我们所做的任何和所有更改都将在LuaJIT的正常许可下完全开源,因此当我们对LuaJIT进行改进时,整个LuaJIT社区都将受益。我还希望我们,更广泛地说,在更广泛的卢阿吉特社区中,成为好公民。我们知道我们有很多东西要向您学习,从基准测试的想法到性能问题的具体经验。不要羞于联系!