西西河

主题:【原创】简单说两句动态优化 -- Highway

共:💬8 🌺1
全看分页树展 · 主题
家园 【原创】简单说两句动态优化

在今天的大讨论中,大家都提到了动态优化,有的人对此有些陌生,我就简单说两句。

动态优化最简单的一个例子就是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++。

动态优化的方法手段很多,我只是举一个例子说明一下问题。

好了,快凌晨一点了,睡觉去了!

点看全图

外链图片需谨慎,可能会被源头改

全看分页树展 · 主题


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河