我是一個Java的反對者,至于為什么,我想最大的一個原因是它不實在,不管是當年sun所說的一些言論,還是如今Java用戶的一些言論,都有蠱惑之嫌,甚至很多太假了,而這些言論層出不窮,其實就語言本身我不想說什么,任何語言存在都有它的道理,而且都有適合它的應用場景,但是如果總是夸大實在讓人不爽
一、Java是簡單的
Java簡單嗎,反正我不覺得,當然這是Java剛問世時說的,在當時看來還勉強說的過去,不過這句話至今仍在被引用,而且總是在和C++對比,不能說比C++簡單就叫簡單吧,難道會有人認為有比C++還復雜的語言?這樣的對比顯然是有問題的
二、一次編譯到處運行
這句話應該有個前提,就是只要那個平臺上有JVM,不過我不想咬文嚼字找漏洞,這樣也沒什么說服力,我認為這算不上什么優點,首先對于腳本語言而言,一次編寫(不需要編譯)就到處運行,豈不是更有優勢,然而沒有哪個腳本語言拿這個出來說事兒,為什么Java總是拿這個說事兒,況且一次編譯到處調試這句話也不是空穴來風。還有經常會拿它的字節碼來說事,仿佛只有java有中間嗎一樣,實際上解釋型語言幾乎都有中間碼,這就是解釋型語言的特點,這個特點在沒有Java之前就有。讓Java說的好像是它創造的一樣,別的語言都是模仿它
三、JIT優化技術可以使Java的運行速度接近C/C++,甚至有些場景下會超越
Java的性能一直是Java開發者心中的痛,無論是當年的sun還是現在的Oracle,幾乎每一次的版本更新都會著重說明性能有很大的提升,而且每一次都像一顆定心丸一樣安慰這它的用戶,使大家對Java的性能有信心。不過從Java誕生起,提升了這么多年,提升了多少呢,不管提升了多少,客戶端(除了andriod)用Java的太少了,就算是不是純java的eclipse的性能也讓人難受,服務端也要分應用,也不是什么服務端程序都適合用Java,通常都是語言本身的性能不會是最大的瓶頸的場景,因為有些場景最大的瓶頸可能是IO或者數據庫等。為什么JIT不能讓Java趕上C++呢,理由很簡單,編譯型語言也不是只有C/C++,還沒有哪個語言做的到,JIT就能?顯然不現實,其實這是語言的特性決定的,C的實現是為了性能可以放棄高級特性,C++的性能也是其最重要的目標之一,而其它語言都是為了高級特性可以犧牲性能,從語言定位上來說,再怎么優化也不可能趕上C/C++,因為優化是不可能違反語言的定位的,這其實是魚與熊掌不能兼得的問題。只要在性能能滿足應用的情況下就可以用,但不要老夸大,越自卑的人自尊心越強,人總是不喜歡承認弱點,但也沒必要過分強調這不是弱點,越強調反而越讓人懷疑
說到性能問題我覺得.net 相對還是比較實在的,當年我用.net 1.1 的時候,性能是非常差的,一個普通的WinForm窗口,如果在里面排列多一點的控件的話,運行時都能看出來你拖放控件的順序,非常明顯,但現在好多了,基本上眼睛是看不出來的,都是一起出來的,所以現在很多Windows程序用.net 表現也非常好
四、GC是Java性能的罪魁禍首之一
我覺得說反了,應該說是Java敗壞了GC的名聲,因為很多人都是通過Java認識了GC,導致在很多人心中,GC成了慢的代名詞,實際上這是普遍對GC是的誤解的,GC其實只是個概念,GC曾經考慮過由操作系統實現,自從操作系統都沒實現,就由編程語言來實現了,也導致實現的五花八門。至于性能要看具體實現和算法選擇,這是一項動態內存管理的技術,與C的malloc/free的作用一樣,只是GC可以更高級,malloc/free 通常要按照一定的約定來使用以避免內存泄漏問題,GC與手動內存管理主要區別是GC需要一定的算法來選擇如何釋放內存,手動的不需要。另一個是釋放時機的選擇手動的更自由,通常GC不是很自由,我說的通常是指一些語言不允許GC的可控,事實上GC的實現都是可控的,只是一些語言不允許這么做,問題就出在這了,GC的算法需要時間,而GC的算法并不能保證最優,所以會產生性能問題,實際上一個可控的GC對性能和開發效率才是更好的選擇,根據情況選擇是否要GC自動管理還是手動控制,就像D語言的方案,它使用GC,但性能確很高,而且GC是可控的,你的程序不必完全依賴GC的算法,我一般把這種方式叫半自動的,這樣更好,如何管理內存應該是開發者的自由,因為全自動管理的GC有的時候會造成應用程序的卡頓,特別是在不適合的時候出發GC的內存管理,這讓有些類型的程序很難接受,比如在射擊類的游戲中,或者視頻解碼程序,哪怕是一點點的卡頓體驗也是非常不好的(一秒內少于24楨),但在web這樣的應用中,服務端程序短時間暫停客戶端幾乎感覺不到,即使時間長點用戶也會認為是網絡問題或者瀏覽器問題
更多關于GC的內容請參考http://www.iecc.com/gclist/GC-faq.html
五、網上有很多帖子通過具體代碼測試,Java性能超越了C++
不管代碼是什么,只要是結果上真的超了,那一定是作弊了,不信你可以親自驗證,前提是你真的懂C/C++,不然可能你會中招,但這些帖子很吸引眼球,引來了眾多的不明真想的圍觀群眾。我的觀點是在性能可以接受的情況下,語言的特性能帶來更多的好處,就是好的選擇,這也是php為什么能在web開發方面能流行的原因之一。但是有些Java人老是發這種帖子的行為著實讓人鄙視,而且我發現好像只有Java喜歡挑戰性能,在其它語言上確很少見,這點上值得Java人思考
寫在最后:
看到這Java粉們一定會不高興了,Java優點也很明顯,庫多,非常多。還有一個很大的優點是,Java開發者不需要對底層技術網絡技術等有多么深入的了解就能開發出重量級的應用軟件來,從某種意義上講,這把開發者們從技術細節中解放了出來,更專注于應用邏輯。于是很多重量級的軟件就這樣誕生了,然后就會有一些人質疑,為什么這樣的軟件要用Java開發,然后就有人出來說Java一點都不慢,然后 ......然后不了了之了。其實就語言本向來說,Java曾經還是不錯的。
我們總是謊言聽多了慢慢的也就信了,因為很多時候真相是什么可能并不是那么重要
新聞熱點
疑難解答