我公司内部软件项目主要用Java完成的主要原因是Java程序独立于主机架构,这为将应用程序分发到国际部门提供了很大的灵活性。
我们需要启动一个执行大量数字运算的新应用程序,并且我想使用我们可用的C ++库和代码(我也更喜欢C ++)。
现在我想知道为什么在某种意义上没有一些像Java JIT编译器那样的软件:
这将结合Java和C ++的几个好处:
这样的事情没有成功的原因是什么?
答案 0 :(得分:4)
没有为高性能应用程序做到这一点的主要原因是最后一点性能是以相当高的价格出现的。现代JIT是编译时延迟和生成的代码质量之间的妥协。
相反,现代C ++编译器(包括Intel和GCC)可以静态编译多个替代架构变体,并在加载程序时选择正确的变体。事实证明,无论如何你都没有那么多的变种。实际上,你正在寻找AVX(无/ 1/2)。
如果您的编译器不这样做,那么便宜的手动替代方法是将替代变体放在一组动态加载的库中,并在加载时选择正确的库。使用MSVC的延迟加载库,这可以同样透明。您只需挂钩实际的库加载,即可选择MathAVX.DLL
而不是MathSSE.DLL
。
当然,对于真正的高性能应用程序,您只需说“64位,AVX2”或“CUDA,计算能力6+”。对于此类应用程序,软件定义硬件,而不是相反。