2012-02-29 27 views
5

支持JITed语言(例如C#和Java)的参数是它们可以更好地执行优化,因为虚拟机的运行时分析可以比静态优化的C++代码更好地优化代码。用于优化性能的C++虚拟机

但是,我想知道我们是否也可以使用虚拟机在运行时为C++优化代码,或者更确切地说任何类似的语言。例如,我们可以采用由LLVM编译器生成的IR,并创建一个解释,JIT和优化代码的虚拟机,与Java和C#的情况类似。

当然,不会有垃圾回收,但优化因子会在那里。有没有人在此工作。是否有任何文件,工具?这种方法有多好?

+3

[谷歌搜索“Clang”+“JIT”](https://www.google.com/search?q=clang+jit)提取大量信息。 – ruakh 2012-02-29 20:01:29

+1

Google在更新Chrome时会做一些有趣的事情...程序会部分反编译,以便获得某种符号形式,然后将更新作为该形式的补丁应用,然后将其编译回来。而且,在那些日子里,人们会编写多态程序,在运行时重写自己(例如,当他们检测到“if”条件永远不会是错误的时候,他们只会用“nop”替换指令)。所以,没有理由不可行。我甚至不提“可能”,因为我们知道是这样。 – 2012-02-29 20:12:29

+0

他们确实可以优化得更好,但他们不会。 – 2012-02-29 20:13:19

回答

2

从理论上讲,是的,JIT可以用于C++。它可以利用底层体系结构中的一些优势来积极优化代码。它也会带来使应用程序花费更长时间在运行时加载的缺点。

当然,不会有垃圾回收,因此会产生开销,但优化因素会在那里。有 任何人都在此工作。是否有任何文件,工具?这种方法有多好? ?

这里有一个很大的误解。为每个用户定义的类型在整个板上实施GC是主要的开销。这是Android,iOS和Windows移动已经转向使用C/C++的高性能应用的原因之一,尽管它最初只尝试使用托管虚拟机。

当然,额外的间接级别意味着GC可以自由地执行紧凑内存等操作,但优化的C/C++程序从一开始就已经使用了紧凑的内存。这也意味着内存开始时会更加分散,对于C++擅长的高性能应用程序来说,这是一种性能杀手(它可以处理大型连续的缓冲区,例如视频处理,光线追踪或音频处理)。

同时将每个UDT实例转换为引用意味着所有内容都位于堆上,这有效地将原本只有几个时钟周期的操作转换为数百个。这就是说,为了得到你的问题的核心,当然,C++代码可以使用JIT构建,但是你可能会发现没有真正如此令人信服的理由来做这样的事情,人们通常使用C++代码。

+1

通过说“没有垃圾回收,因此会产生开销”,我说因为没有垃圾回收,开销会更少。你以另一种方式阅读它:)! – MetallicPriest 2012-02-29 20:07:57

+0

@MetallicPriest哦,我的糟糕,我认为这句话意味着会有开销,因为缺乏GC。我习惯于C#/ Java爱好者经常声称GC以某种方式使事情变得更快。确实,当我们不在寻找时,它可以压缩内存,但我们首先需要质疑为什么它需要这样做,而在C++中,我们可以创建用户定义类型的连续紧凑数组(如矩阵)的权利从一开始。 – stinky472 2012-02-29 20:17:16

4

LLVM包含一个JIT编译器lli,Clang已经可以从C++生成位码。我没有尝试过,但我假设你可以在生成的位码文件上使用lli(你可能必须告诉它在哪里找到要链接的C++ lib文件)以及运行时的JIT C++。您甚至应该能够将libC++构建为位代码,以便它可以被JIT控制。

Google的Native Client有一个子项目Portable Native Client,我认为LLVM IR发送给客户端,而不是x86二进制文件,以便在客户端进行连接。

7

这是一个有缺陷的论点。是的,虚拟机可以使用更多的信息 - 但与编译器相比,它们的时间和空间也大大减少。

另外,是的,绝对你可以做到这一点,如果你真的想。但是没有人会这样做,所以它通常不会发生。至少,不是出于优化的原因,你可以做沙盒。

+1

您可以像Clang那样将C++预编译为字节码,此时您可以进行许多优化。 – Xeo 2012-02-29 20:10:41

+1

@Xeo:理论上是的。但是C/C++优化器非常陈旧(以计算机方式),而且做得相当好。所以也许任何额外的性能收益可以忽略不计。很高兴看到有人发表论文(可能他们已经尝试过发现它没有结果)。 – 2012-02-29 20:25:37