最近看到有人發了個挨罵的帖子,講的是java的jit編譯器優化出來的代碼比C++的要快,自然罵者甚眾。
實際上這種可能是存在的,用gcc編譯器做了點小測試,發現再怎么優化也不能生成一些新的P6指令(可能是我沒掌握技巧吧),比如條件傳送指令(CMOVxx)沒生成出來。我想它可能是為了兼容性吧,只生成兼容大多數CPU的指令,不知道把它能不能針對特定平臺優化指令。
java的jit可以避免這樣的兼容性問題,它在運行時才編譯成機器碼,自然可以生成優化指令,估計那些測試也是這么比較出來的。說它編譯出來的代碼比c++編譯器生成的要快,我想是完全可能的,使用某些平臺特定的指令可以加快執行速度。大部分C++編譯器生成的都是通用指令,雖然換一臺機器也可以執行,但是絕對不是效率最高的。
僅僅這一點不能說明java更快,別忘了,java虛擬機還要做很多別的事。也就是說,雖然生成的代碼效率可能更高,但在其它方面會把速度拖慢下來。
既然jit有這樣的優點,為何C++不把它吸收過來呢?先生成中間代碼,在程序啟動時生成優化代碼。。。
實際上這種可能是存在的,用gcc編譯器做了點小測試,發現再怎么優化也不能生成一些新的P6指令(可能是我沒掌握技巧吧),比如條件傳送指令(CMOVxx)沒生成出來。我想它可能是為了兼容性吧,只生成兼容大多數CPU的指令,不知道把它能不能針對特定平臺優化指令。
java的jit可以避免這樣的兼容性問題,它在運行時才編譯成機器碼,自然可以生成優化指令,估計那些測試也是這么比較出來的。說它編譯出來的代碼比c++編譯器生成的要快,我想是完全可能的,使用某些平臺特定的指令可以加快執行速度。大部分C++編譯器生成的都是通用指令,雖然換一臺機器也可以執行,但是絕對不是效率最高的。
僅僅這一點不能說明java更快,別忘了,java虛擬機還要做很多別的事。也就是說,雖然生成的代碼效率可能更高,但在其它方面會把速度拖慢下來。
既然jit有這樣的優點,為何C++不把它吸收過來呢?先生成中間代碼,在程序啟動時生成優化代碼。。。