主题:【原创】简单说两句动态优化 -- Highway
在今天的大讨论中,大家都提到了动态优化,有的人对此有些陌生,我就简单说两句。
动态优化最简单的一个例子就是Function inline.
比方有一个问题,我们用Java和C++各写了一个版本。作为一个合格的程序员,我们将一些相对独立的运算放在一个Function内,这样一段逻辑在我们的project只有一段Code。这是最基本的程序要求(single implementation, code re-use...) ,我想大家对此不会有问题吧。
我们的两个版本都编译好了。C++应该是将source code做了最大可能的优化,在它力所能及的范围下。但是如果我们的程序密集的调运某一个Function,而这个function内部又有很多细小的get,set调用(现在Java,C++中有很多get, set这一类简单的Function)。Java在运行一段后发现了这个热点(就是所谓的hotspot,也就是费时的,反复进行的操作),决定对其进行"动态优化"。最简单的就是将这些七七八八的function合并,形成一个大的function。这样程序执行的时候,中间所有的函数调用开销全部免掉了,性能迅速提高。如果函数的主体是一些数值计算,那么C++也没有什么办法优化出更好的代码来。而Java由于避免了大量的函数调用开销,从而性能超过了C++.
当然了,C++的函数调用开销其实不是很大,我说的例子只有在设定的情况下才会产生。但这确实真实的情况。3年前我们验证了事实。(我们的问题是各种复杂的trading type 的evaluation的数学模型)。
那么为什么C++不进行Function-in-line的优化呢?因为你的程序有很多的Function,C++编译器不知道那个会被频繁使用,那些因该合并,因该优化。如果全部优化的话,那么代码Size膨胀,尺寸上又不合适了。(程序员可以在Source code中使用Function-in-line,当然了,他得知到是那些函数将会被密集的调运)。
另外更重要的一点,C++是面向对象的语言(Object-Oriented),子类可以Override base class的function。这样,静态语言无法在运行前决定inline哪一个版本的function。
这个问题对于Java同样存在。Java可以在任何时候Load新的Class。如果新的Class Override base class的function,那么Java要将已经优化的Code推倒重来,就是所谓的de-optimization,从而保证程序执行的正确性。这一特点是“编译时一次搞定”的语言所不具备的。
所以在这个情况下,动动态优化显示了魅力,Java Beat了C++。
动态优化的方法手段很多,我只是举一个例子说明一下问题。
好了,快凌晨一点了,睡觉去了!
- 相关回复 上下关系8
😅【原创】简单说两句动态优化
为什么一定要VM的存在才能做优化呢? 梦里依稀 字321 2004-07-23 23:19:01
☹️我还以为昨天老兵和我把这个问题说清楚了。看来还没有! Highway 字266 2004-07-24 07:02:03
呵呵,二位火眼金睛 梦里依稀 字1045 2004-07-24 09:30:58
😉Nothing is impossible! Highway 字55 2004-07-24 12:28:51
😜Highway不必那么客气嘛 梦里依稀 字38 2004-07-24 12:42:06
就是这个意思啊 ppw 字55 2004-07-24 05:29:06
不是一回事的东西, 非要比 ppw 字257 2004-07-25 08:42:03