支持JITed语言(如C#和Java )的一个论点是,它们可以更好地执行优化,因为虚拟机的运行时性能分析可以比C++的静态优化代码更好地优化代码。
然而,我想知道我们是否也可以使用虚拟机来优化C++或任何类似语言的运行时代码。例如,我们可以利用LLVM编译器生成的IR,并创建一个解释、即时和优化代码的虚拟机,类似于Java和C#的情况。
当然,不会有垃圾收集,但优化因素是存在的。有没有人做过这件事。有没有关于这个的论文和工具?这种方法会有多好?
发布于 2012-03-01 04:06:22
这是一个有缺陷的论点。是的,虚拟机有更多的信息可供使用-但与编译器相比,它们的时间和空间也要少得多。
而且,是的,如果你真的想做的话,你绝对可以做到。但没有人这样做,所以它通常不会发生。至少,不是出于优化的原因,您可能会为了沙箱而这么做。
发布于 2012-03-01 04:05:39
LLVM包含一个即时编译器lli,Clang已经可以从C++生成位码。我还没有尝试过,但我假设您可以在运行时对生成的位码文件(您可能需要告诉它在哪里可以找到要链接的C++库文件)和JIT C++使用lli。您甚至应该能够将libc++构建为位代码,以便它也可以是JITed。
谷歌的Native client有一个子项目,Portable Native Client,我认为LLVM被发送到客户端,而不是x86二进制文件,在客户端被jitted。
发布于 2012-03-01 04:05:06
从理论上讲,是的,可以为C++创建JIT。它可以利用底层架构中的一些东西来积极地优化代码。这也会带来使应用程序在运行时需要更长时间加载的缺点。
当然,不会有垃圾回收,因此会产生开销,但优化因素是存在的。有没有人做过这件事。有没有关于这个的论文和工具?这种方法会有多好?
这里有一个很大的误解。对每个用户定义的类型全面实施GC是主要的开销。这就是为什么Android、iOS和Windows mobile都转向C/C++来获得高性能的应用程序的原因之一,尽管它们一开始都试图只使用托管的虚拟机。
当然,额外的间接级别意味着GC可以自由地执行诸如压缩内存之类的事情,但是优化的C/C++程序从一开始就已经在使用压缩内存了。这也意味着内存最初更加碎片化,这是C++擅长的那种高性能应用程序的性能杀手(处理大型连续缓冲区的应用程序,例如视频处理、光线跟踪或音频处理)。
此外,将每个UDT实例转换为引用意味着一切都在堆上,这有效地将最初几个时钟周期的操作变成了数百个。
也就是说,为了切中问题的核心,确实可以使用JIT构建C++代码,但是您可能会发现,考虑到人们通常使用C++代码的静态性质,实际上并没有这样令人信服的理由这样做。
https://stackoverflow.com/questions/9505699
复制相似问题