西西河

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

共:💬8 🌺1
全看树展主题 · 分页首页 上页
/ 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++。

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

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

点看全图

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

家园 为什么一定要VM的存在才能做优化呢?

VM提供的功能,操作系统这一层都可以实现啊,程序调用函数的一些信息完全可以保存在目标代码里面。刚才想说有源程序信息就可以的,后来想想不对 :)

或者,可能被多次调用的的程序都可以翻译成为两个分支,一个Inline, 一个不Inline的。

其实我想说的是,动态优化不一定要以必须解释执行为代价,至少是不必以解释执行所有的代码为代价。

家园 就是这个意思啊

之所以用vm, 比如java, 其实是政治经济问题, 不是技术问题.

家园 我还以为昨天老兵和我把这个问题说清楚了。看来还没有!

如果你还有疑惑,可以学学Compiler这门课。也许能有所帮助。

Java, .NET和C/C++这两类语言的根本区别是什么,这是我们讨论问题的根本。希望我们能有共识。否则...

你说的IDEA也是有的,昨天我和老兵说的Profile-based的优化就是这个意思。但这和JVM/CLR的运行时优化是两码事。


本帖一共被 1 帖 引用 (帖内工具实现)
家园 呵呵,二位火眼金睛

动态编译技术俺确实了解得不多,不过经过二位的解释,我想也应该有些概念的了的。不过Compiler是怎么回事,Java解释执行和C语言的区别俺还是知道的,C编译的结果已经就是本机CPU的指令集,Java的中间代码还是独立于本机指令集的中间代码,因此在VM把它变成最终的交给CPU执行的指令的时候可以按照动态收集的信息,选择比较好的翻译方式。

俺比较多的从系统的角度考虑问题,俺原来的意思其实就是这个动态优化的功能从理论上说在操作系统一级是可以实现的,VM的存在,不仅仅是要做动态优化,他还要做的工作在于维持中间代码独立于本机指令集的这个任务,而如果只考虑优化问题的话,把这个任务完全交给操作系统,俺认为可以做得到,CPU真正执行的指令序列是会要有所变化,但是可以是经过事先编译过的机器码片断。由操作系统来决定如何装配。

当然啦,这是个wild idea, 完全不是从现有的系统框架考虑问题。

不过,睡了一觉起来,又仔细想了想现有操作系统调用用户进程的方式,还有编译和执行的功能分开的原理和目的,确实,使用VM是一个比较顺理成章的解决方式,不过,如果我是一个致力于优化程序性能的人,俺还是会忍不住想去探索,真的没有两全其美的方式?

I think this is an open problem.

家园 Nothing is impossible!

Keep thinking and your dream may come true someday!

家园 Highway不必那么客气嘛

俺都说了俺懂得不多,你就不必寒碜我了。

家园 不是一回事的东西, 非要比

我根本就不把JAVA叫COMPILER, 解释器就是解释器.

我是不是要把PHP/PERL也叫COMPILER呢?

说起什么JAVA的可移植性我就觉得好笑. 你要到处都装IBM出产的

C COMPILER, c程序移植性也不错呢.

其实不过是不接口工作交给另一层做而已.

什么语言可移植性最好?

当然是HTML了.

全看树展主题 · 分页首页 上页
/ 1
下页 末页


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

Copyright © cchere 西西河