posts - 30,  comments - 28,  trackbacks - 0
          ? “C++比Java快”,“Java運行于虛擬機上,當然要比C++慢”,“C++生成的是本地代碼,直接運行于本地硬件上”,“速度比Java快多了”......
          ??? 這是我一年前學Java時的想法,為什么有那些想法?很簡單,人云亦云罷了。既然那么多“高手”都這么說,那么多“精通”Java和C++的人都那么說,自然而然就信了。
          ??? 就這么過去了一年,對Java也越來越熟悉。自己依然是個初學者,而且相信不上升到布盧斯.艾克爾那個高度,就別想說自己精通C++和Java!
          ??? 雖說仍舊是初學者,卻對國內那些“高手高手高高手”們的一些言論有了懷疑:Java不比C++慢!然而無論我在哪個論壇上,那個技術群里頭發表這個觀點,立刻會有一群“高手”來糾正,甚至有一次一個號稱“一般不學語言,要學兩個禮拜就能搞定”的“高手”很鄭重其事地向我說明原理。當我了解到此人Java才學了一個月的時候,實在是無語了。還要一次一個高手批駁我,于是乎小心問了句,了解C語言里malloc和free函數的機制與否。此“高手”很不屑地告訴我:C++里的new 和 delete就能搞定,malloc早就沒用了。又無語:也許他用的“C++"是他自己發明吧。
          ?? 只想問一句那些“高手”,看過近年來Java PK C++的一些精彩報告沒?那些報告可是國外權威機構的文獻啊!是通過實驗得來的數據!
          ?? 還想問一句:你們說Java慢,是什么人,什么時候說的?那些言論的源頭,大多數是Java 1.2時代以前的啊。
          ? 說Java比C++慢的人,是否真的親自寫過測試代碼?(雖說我的代碼不能算精確,但也好歹做過近十次的實驗,用了好幾種不同的JVM或Cpp編譯器,Java大獲全勝)
          ? 說Java比C++慢的人,是否了解JVM的運行機制?(我只能說我了解一些罷了)
          ? 說Java比C++慢的人,是否有拿得出手的報告或實驗?(可惜,從來沒遇到過)
          ? 說Java比C++慢的人,請去學習一下唯物論!
          ??而且為什么只有在國外才有那么多人認為Java快,只有國外的科研機構才花費時間和精力去做那些被很多國內程序員斥為“沒用”(和好多程序員聊天時,他們這么認為)的實驗?是中國的程序員都是天才么?還是中國的計算機業太“先進”了,不需要去關心這些東西呢?
          ? 實在是發人深省!!!
          ???
          posted on 2006-06-29 06:22 murainwood 閱讀(5228) 評論(19)  編輯  收藏 所屬分類: 隨感


          FeedBack:
          # re: 一點小感想:為什么那么多人說Java慢???
          2006-06-29 11:09 | fjchenq
          其實C++是用new 和 delete創建與銷毀對象的。  回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???
          2006-06-29 11:15 | fjchenq
          為什么說java比c++慢。

          有一個很簡單的事實說明,為什么java沒有用在開發操作系統、驅動程序等等底層的程序上。

          如果說java不比c++慢,那只有一個條件下,那就是內存足夠大,java的實現把許多東西都放入內存中。這就是為什么delphi在256M內存可以跑的很流暢,而jbuilder在512M內存下,還跑得相當慢。

          如果你有足夠大的內存,開發java程序也很快呀。
          oracle 8i和oracle8兩個軟件其實相當不大,但是oracle8i對內存要求高得很多,為什么呢?因為oracle8i有一部分用java開發的。

          如果你不相信這點,oracle10g安裝到256M內存的電腦試試,我相信你會吐血。我曾經試過,花的一個下午還沒有安裝結束。

          總得來說,如果你開發web程序等,推薦用jsp和.net技術。這兩種技術相對來說比較簡單。





            回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???
          2006-06-29 14:30 | murainwood
          @fjchenq
          如果你了解C++的new 和 delete的底層機制,就會知道
          他們就是調用malloc和free來實現的
          C/C ++里面的內存分配和銷毀,實質上全是malloc 和 free.
          C++為了安全的考慮,“包裝”了這兩個函數。在STL則是更進一步“包裝”
            回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???
          2006-06-29 14:39 | murainwood
          Java的就是以內存換速度的
          現在的內存好像已經蠻便宜了吧?再者,我想現在你也不會用256M內存的機器來使用oracle10。
          C語言是必不可少的(操作系統,游戲引擎),但是C++的地位卻有些“尷尬”,不是么?STL庫讓曾經C++達到巔峰,然而巔峰之后?曾經有段時間我非常喜歡STL,然而STL的語法風格實在是欠缺優美
          C++/CLI被標準委員會否決,實在太讓人失望了。  回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???
          2006-06-29 14:47 | murainwood
          Java無法進行底層開發是因為其運行機制的緣故罷了,說“Java因為速度慢而無法進行底層開發”,這句話沒有邏輯可言。不能因為Java無法開發操作系統而來說明Java的速度慢。
          而且底層開發C用得更多,極少有操作系統用C++寫的。



            回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???
          2006-08-01 06:02 | murainwood
          Java的速度快是相對的,不是絕對的。換而言之,Java的速度慢也是一樣道理。效率~~  回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???[未登錄]
          2007-12-29 17:28 | jimmy
          java里使用垃圾回收機制的策略管理內存,這樣內存得不到及時釋放,導致運行速度很慢,這是主要原因吧,但這種方式使程序員不用自己管理內存,很安全  回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???
          2008-03-13 12:04 | Jonlee
          Why Java Will Always Be Slower than C++
          by Dejan Jelovic

          為什么Java永遠比C++慢?

          耍過Java程序,或者用Java碼過程序的人都曉得,Java要比用C++寫成的原生程序要慢。這是咱用Java時已經承認的事實。
            不過,很多人想要說服我們說這只不過是暫時的,他們說Java從設計上來講并不慢,相反,只是現在的JIT實現相對比較嫩,有很多能優化的地方JIT并沒有優化到,拖了后腿。其實不然,不管JIT們多牛,Java永遠要比C++慢。
            
            我想說...
            宣揚Java不慢于C++的人往往是覺得,(語法)嚴格的語言,可以讓編譯有更大的優化空間。因此,除非你想做人肉編譯器優化整個程序,否則通常都是編譯器做得更好。
            這是真的。在數值計算領域,Fortran仍然勝于C++,的確因為它更嚴格。不用擔心指針瞎攪和,編譯器可以更安心地優化。C++想打敗Fortran的唯一辦法,就是好好設計一個像Blitz++那樣的庫。

            測試...
            Java可以跟得上C++的地方,就是基準測試。計算起第N個斐波納契數,或者運行起Linpack,Java沒理由不跟C++跑得一樣快。當所有的計算都放在一個類里,并且只使用基本的數據類型,比如說int或者double時,Java編譯器的確能跟得上C++的腳步。

            事實...
            當開始在程序中使用對象的時候,Java就放松了潛在的優化。這一節會告訴你為什么。

            1. 所有的對象都是從堆里分配的。
            Java從棧里分配的,就只有基本數據類型,如int,或者double,還有對象的引用。所有的對象都是從堆里分配的。
            當有大量語義上是一回事的對象時,這不成問題。C++同樣也是從堆上分配這些對象。但是,當有值語義不同的小對象時,這就是一個主要的性能殺手。
            什么是小對象?對我來說,就是迭代器們。在設計中,我用了很多迭代器。別人可能會用復數。3D程序員可能會矢量或者點類。處理時間序列的人可能會有時間類。使用這些類的人,無一例外地討厭把不費時間的棧上分配換成花費固定時間的堆上分配。假如把它放在一個循環里,就變成了O(n)對0了。如果再加一層循環,沒錯,又變成O(n^2)對0了。

            2. 大量的轉換。
            得益于模板,好的C++程序員甚至可以寫于完全沒有轉換的牛程序。不幸,Java沒有模板,所以Java代碼總是充滿了轉換。
            對于性能,它們意味著什么?呃,在Java里所有的轉換都是很費時的動態轉換。多費時?想想你可能會怎么樣實現轉換的:
            最快的方法就是,給每一個類賦值一個序號,然后用一個矩陣來描述任意兩個類是否相關的。如果是的話,需要給指針加上多少的位移才能進行轉換。這種方法的偽碼看起來應該是這樣的:
          DestinationClass makeCast (Object o, Class destinationClass) {
          Class sourceClass = o.getClass (); // JIT compile-time
          int sourceClassId = sourceClass.getId (); // JIT compile-time

          int destinationId = destinationClass.getId ();

          int offset = ourTable [sourceClassId][destinationClassId];

          if (offset != ILLEGAL_OFFSET_VALUE) {
          return <object o adjusted for offset>;
          }
          else {
          throw new IllegalCastException ();
          }
          }
          好一堆代碼。這只是一個簡單的情景——用矩陣來表示類的關系浪費了一部分內存,沒有哪個成熟的編譯器會這樣子做。他們會使用map或者遍歷繼承樹,這樣會變得更慢。

            3. 攀升的內存占用。
            Java程序儲存數據占用的內存大概是相當的C++程序的兩倍。原因如下:
            1. 啟用了垃圾收集的程序一般都比不使用垃圾收集的程序多花50%的內存。
            2. 本來C++里在棧上分配的對象,到了Java就在堆上分配了。
            3. Java對象比較大,因為所有的對象都有一個虛表,還要加上對(線程)同步的原生支持。
          大的內存映像讓程序更大概率被放到磁盤的交換區去。沒有什么比交換文件更慢的了。
            4. 缺少更細致的控制。
          Java原來就是作為一種簡單的語言來設計的。很多在C++里讓程序員控制細節的特性在Java里都被一腳踢開了。
            比如說,在C++里可以改進引用的位置(?)。或者一次申請和釋放很多個對象。或者用指針耍一些小技巧,更快地訪問成員。
            5. 沒有高層次的優化。
            程序員處理高層次的概念。而編譯器處理剩下的低層次概念。對于程序員來說,一個叫Matrix的類就代表了比一個叫Vector的類更高層次的概念。而對于編譯器來說,這些名字都是符號表的一個入口。他們只關心類里面有哪些函數,函數里面有哪些語句。
            這樣想一下,比如說要實現一個exp(double x, double y)函數,計算出x的y次冪。對于一個編譯器,它能只看一下這個函數,然后指出,exp(exp(x, 2), 0.5)可以優化成x自己嗎?當然不行。
            編譯器能做的優化只是語句層面的,而y是在編譯器里面的。即使程序員知道兩個函數是對稱的,可以把它們都消去,或者函數的調用順序只是相反的,除非編譯器能只瞄一下語句,然后指出來,不然優化是不可能完成的。
            所以,如果想要完成一個高水平的優化,必須存在某種方法,可以讓程序員來告訴編譯器優化的規則。

            沒有哪個流行的程序語言/系統可以做到這點,至少已知的方法,比如微軟承諾的智能語言,都不能。即便如此,在C++里可以用模板元編程來實現對高層次對象的優化。臨時消除,部分求值,對稱函數調用的消去,和其它可以用模板實現的優化。當然,不是所有的高層次優化都可以這樣做。并且實現這些東西相當麻煩。但是大多數都可以完成,有人已經用這些技術實現了好些時髦的庫。

            不幸的是,Java沒有任何元編程的特質,因此在Java中不會有這種高層次的優化。
            所以...

            由于存在這種語言特性,Java不可能達到C++這種速度。這相當程序上暗示了,對于要求高性能的軟件和競爭激烈的COTS舞臺上,使用Java不是一種明智的選擇。但是因為它和緩的學習曲線,它的容錯,和它龐大的標準庫,所以適合開發中小型自用和定制軟件。

            附記...
            1. 有人向James Gosling(誰?google之...)提交了很多可以改進Java性能的語言特性。文本在這里。不幸的是,Java語言已經有四年沒有改動過了,所以看起來這些提議似乎不會在一夜之間被實現。

            2. 最有可能往Java里加入泛型的是Generic Java。又很不幸的是,GJ只是通過在編譯時把所有類型信息去掉來支持泛型。所以最后面執行環境看到的,仍然是緩慢的轉換。

            3. 垃圾收集的FAQ包含了關于垃圾收集慢于定制分配器的信息(上面第四點)。

            4. 這里是一篇宣稱垃圾收集比棧分配的快的文章。但是它的要求是物理內存必須是程序實際需要的內存的七倍之多。還有,它描述的是一種stop-and-copy(是不是那種執行到一半,然后停下來,把內存拷到另外一塊內存,同時清除垃圾的那種方法?),而且還不是并發的。

            反饋...
            我收到很多關于這篇文章的反饋。附上一些典型的評論,還有我的回答:

            “你還忘記了指出在Java里所有的方法都是虛方法,因為沒有人會加上final關鍵字。”
            事實上,不使用final關鍵字不是問題的關鍵所在,使用者才是。同時,虛函數也沒有問題,但是卻失去了優化機會。自從JIT們知道怎么樣內聯虛函數,這就變得不那么顯著了。

            JIT可以內聯虛函數,所以Java可以比C++更快。
            C++也可以使用JIT編譯。不信的可以看看.NET的C++編譯器。

            到最后的時候,速度并不重要。電腦浪費了大部份時間在等待用戶輸入。
            速度仍然很重要。我仍然在等我的筆記本啟動起來,我在等我的編譯器停下來,我還要等Word打開一個超長的文檔。
            我在一個金融公司工作。有時候我必須對一個很大的數據集進行模擬。速度在這種情況下都很重要。

            有些JIT可以在棧上分配一些對象。
            當然,一些。

            你的轉換代碼看起來很丑。可以在類的繼承層次上檢查類。
            首先,這樣只比矩陣查找快一點點而已。
            第二,這樣只能查找類,類只占多少?低層次的細節往往是通過接口來實現的。

            哈,那么我們都應該使用匯編?
            不是的,我們都要使用對業務有用的語言。Java提供了龐大的標準庫,讓很多任務變得容易,因此Java是偉大的。它比其它所有的語言更容易移植(但并非100%可移植——不同的平臺有不同問題)。它具有垃圾收集機制,簡化了內存管理,同時也讓某些構造如閉包可實現。
            但是,同時,Java和所有的語言一樣,也有瑕疵。在值語義的類型上缺少支持。它的同步并不是很有效率。它的標準庫建立在異常檢查之上,把實現拖進了接口。它的性能可以更好。它的數學庫有些惱人的問題。諸如此類。

            這些缺憾都是大問題嗎?看你用它做什么。因此,在幾種語言里,連同它的編譯器以及可以選擇的類庫里選擇對你的工程有利的一種。
            回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???
          2008-03-13 12:05 | Jonlee
          上面這篇文章可不是中國人寫的哦  回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???
          2008-05-23 13:07 | :
          :  回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???[未登錄]
          2008-05-27 12:53 | feng
          mark, 不懂java. 不過對C++不用于編寫操作系統有點不明白? C++是C的超集,提出面向對象編程的思想, 為什么不可以用C++編操作系統? C的語法C++都支持不是嗎?? 用C編寫操作系統想起來都很累. 是不是C++的程序編譯之后不如C的快?  回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???
          2008-11-19 16:47 | 路人
          我一直都很喜歡java
          我不是高手
          但是我比較相信thinking in java 畢竟是全球最受歡迎的java著作
          thinking in java里講到java比c++慢
          雖然我沒做過實驗 但我還是比較相信這本書的  回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???
          2008-12-08 21:38 | murainwood
          影響Java性能的一個重要原因--垃圾收集。
          僅僅是原始類型的重復計算,確實無法比出快慢。
          我的團隊今年年初做了一個項目,就涉及到這個問題。32位JVM有效管理的Heap,最好不要超過1G。不然一次Full GC,真能把應用給阻塞住。
          兩年前寫的東西,現在看來,太過于幼稚啦。  回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???[未登錄]
          2009-05-27 18:10 | aaa
          做編程的門類很多 不同平臺上 不同性質的應用
          你如果完全了解所有門類
          你就應該知道為何java慢了  回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???
          2009-06-22 15:46 |
          Java桌面應用慢到死!垃圾一樣的東西  回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???[未登錄]
          2009-12-15 17:02 | 光光
          c++存在一個函數表,訪問一段代碼至少要訪問兩次內存,所以在對性能要求很高的操作系統內核上不適宜使用  回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???
          2011-08-10 09:27 | 嗷嗷嗷
          還是那句話,你下結語評論的時候,不要忘記前提。
          如果在微觀上面講,做一個應用,java的每次損耗是6ms,而C++是2ms,那么這是看不出來,在人的感覺也不明顯,因而判定Java不必C++慢。
          但從宏觀上面來講,如果你的應用是幾百萬 上千萬的量,那么這些積累起來就是比較大的損耗了。這就是Java為什么通常應用集群技術等等。
          而且一味的擴大內存也有瓶頸,為什么,在桌面級別應用上面,如windows上面會page內存到磁盤,別忘了 實際磁盤速度這10幾年其實并沒有太多變化,仍然大大跟不上內存,所以一般太大的程序,長時間不使用,一旦最大化,就要等待很久時間。比如游戲等等。
          其實要說Java慢,并非語言本身,而是不同的機制。這么多年Java在算法上面改進了多少?可是本身硬傷是不可能有太多改變的,所以只能靠機器的提升。如果你是C++程序員,你要掌握比Java更多的處理內存的方法和技術,帶來的是可以稍微低端的計算機可以跑。
            回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???[未登錄]
          2013-03-13 15:41 | aa
          莫名被最后一句話戳中笑點@fjchenq
            回復  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???[未登錄]
          2015-10-06 12:05 |
          .class文件也是一些指令吧,執行.class文件的時候要進行一次指令搜索,這一層是搜索到的指令又要調用一層操作系統層的指令,而C++少了第一次的指令調用,時間就是這么多出來的 。當然可能還有其它原因。  回復  更多評論
            
          <2008年3月>
          2425262728291
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          如果真的給你一片天,你敢不敢要?

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          相冊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 文安县| 井研县| 樟树市| 响水县| 汶川县| 安多县| 昔阳县| 福州市| 五河县| 浦江县| 萝北县| 将乐县| 修文县| 鄱阳县| 大洼县| 双桥区| 万载县| 本溪市| 仁寿县| 隆尧县| 德钦县| 黑龙江省| 静乐县| 雷波县| 临城县| 潼关县| 喀喇沁旗| 抚州市| 红原县| 新源县| 元江| 安仁县| 洛扎县| 蓬安县| 勐海县| 长治市| 宜君县| 资源县| 邳州市| 大兴区| 波密县|