用于优化性能的C++虚拟机

A virtual machine for C++ for optimizing performance

本文关键字:C++ 虚拟机 性能 优化 用于      更新时间:2023-10-16

支持C#和Java等JITed语言的一个论点是,它们可以更好地执行优化,因为虚拟机的运行时评测可以比C++的静态优化代码更好地优化代码。

然而,我想知道我们是否也可以使用虚拟机在C++或任何类似语言的运行时优化代码。例如,我们可以使用LLVM编译器生成的IR,并制作一个虚拟机来解释、JIT和优化代码,类似于Java和C#的情况。

当然,不会有垃圾收集,但优化因素会存在。有人做过这个吗。这上面有文件和工具吗?这种方法会有多好?

这是一个有缺陷的参数。是的,虚拟机有更多的信息可供使用,但与编译器相比,它们的时间和空间也要少得多。

此外,是的,如果你真的想,你绝对可以这样做。但没有人这样做,所以通常不会发生。至少,不是出于优化的原因,您可以这样做是为了沙箱。

LLVM包含JIT编译器,lli和Clang已经可以从C++中生成位代码。我还没有尝试过,但我认为您可以在运行时对生成的位代码文件(您可能必须告诉它在哪里可以找到要链接的C++库文件)和JIT C++使用lli。您甚至应该能够将libc++构建为位代码,这样它也可以是JITed。

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

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

当然,不会有垃圾收集,因此开销,但优化因素会存在。有任何人都参与其中。这上面有文件和工具吗?多好这种方法会是吗?

这里有很大的误解。对每个用户定义的类型全面强制GC是主要的开销。这也是Android、iOS和Windows移动设备都转向C/C++用于高性能应用程序的原因之一,尽管最初尝试只使用托管虚拟机。

当然,额外的间接级别意味着GC可以自由地执行压缩内存之类的操作,但优化的C/C++程序从一开始就可以使用压缩内存。这也意味着内存最初会更加碎片化,这对于C++擅长的高性能应用程序(处理大型连续缓冲区的应用程序,例如视频处理、光线跟踪或音频处理)来说是一个性能杀手。

此外,将每个UDT实例变成引用意味着所有东西都在堆上,这有效地将原本只有几个时钟周期的操作变成了数百个。

也就是说,为了深入了解问题的核心,当然,C++代码可以使用JIT构建,但你可能会发现,考虑到人们通常使用C++代码的静态性质,这样做并没有真正令人信服的理由。