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


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

          有一個很簡單的事實說明,為什么java沒有用在開發(fā)操作系統(tǒng)、驅(qū)動程序等等底層的程序上。

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

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

          如果你不相信這點,oracle10g安裝到256M內(nèi)存的電腦試試,我相信你會吐血。我曾經(jīng)試過,花的一個下午還沒有安裝結(jié)束。

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





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



            回復(fù)  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???
          2006-08-01 06:02 | murainwood
          Java的速度快是相對的,不是絕對的。換而言之,Java的速度慢也是一樣道理。效率~~  回復(fù)  更多評論
            
          # re: 一點小感想:為什么那么多人說Java慢???[未登錄]
          2007-12-29 17:28 | jimmy
          java里使用垃圾回收機制的策略管理內(nèi)存,這樣內(nèi)存得不到及時釋放,導(dǎo)致運行速度很慢,這是主要原因吧,但這種方式使程序員不用自己管理內(nèi)存,很安全  回復(fù)  更多評論
            
          # 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時已經(jīng)承認(rèn)的事實。
            不過,很多人想要說服我們說這只不過是暫時的,他們說Java從設(shè)計上來講并不慢,相反,只是現(xiàn)在的JIT實現(xiàn)相對比較嫩,有很多能優(yōu)化的地方JIT并沒有優(yōu)化到,拖了后腿。其實不然,不管JIT們多牛,Java永遠要比C++慢。
            
            我想說...
            宣揚Java不慢于C++的人往往是覺得,(語法)嚴(yán)格的語言,可以讓編譯有更大的優(yōu)化空間。因此,除非你想做人肉編譯器優(yōu)化整個程序,否則通常都是編譯器做得更好。
            這是真的。在數(shù)值計算領(lǐng)域,F(xiàn)ortran仍然勝于C++,的確因為它更嚴(yán)格。不用擔(dān)心指針瞎攪和,編譯器可以更安心地優(yōu)化。C++想打敗Fortran的唯一辦法,就是好好設(shè)計一個像Blitz++那樣的庫。

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

            事實...
            當(dāng)開始在程序中使用對象的時候,Java就放松了潛在的優(yōu)化。這一節(jié)會告訴你為什么。

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

            2. 大量的轉(zhuǎn)換。
            得益于模板,好的C++程序員甚至可以寫于完全沒有轉(zhuǎn)換的牛程序。不幸,Java沒有模板,所以Java代碼總是充滿了轉(zhuǎn)換。
            對于性能,它們意味著什么?呃,在Java里所有的轉(zhuǎn)換都是很費時的動態(tài)轉(zhuǎn)換。多費時?想想你可能會怎么樣實現(xiàn)轉(zhuǎn)換的:
            最快的方法就是,給每一個類賦值一個序號,然后用一個矩陣來描述任意兩個類是否相關(guān)的。如果是的話,需要給指針加上多少的位移才能進行轉(zhuǎn)換。這種方法的偽碼看起來應(yīng)該是這樣的:
          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 ();
          }
          }
          好一堆代碼。這只是一個簡單的情景——用矩陣來表示類的關(guān)系浪費了一部分內(nèi)存,沒有哪個成熟的編譯器會這樣子做。他們會使用map或者遍歷繼承樹,這樣會變得更慢。

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

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

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

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

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

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

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

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

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

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

            JIT可以內(nèi)聯(lián)虛函數(shù),所以Java可以比C++更快。
            C++也可以使用JIT編譯。不信的可以看看.NET的C++編譯器。

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

            有些JIT可以在棧上分配一些對象。
            當(dāng)然,一些。

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

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

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

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

          常用鏈接

          留言簿(3)

          隨筆分類

          隨筆檔案

          相冊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 马鞍山市| 镇江市| 丹棱县| 许昌市| 杭锦后旗| 江津市| 得荣县| 天等县| 九龙城区| 吴堡县| 金川县| 宝丰县| 金寨县| 陈巴尔虎旗| 息烽县| 登封市| 定襄县| 万源市| 吉林省| 岑巩县| 卢龙县| 安仁县| 呼图壁县| 蕲春县| 玛多县| 铜陵市| 合阳县| 东丰县| 即墨市| 五指山市| 镇雄县| 峨眉山市| 金昌市| 水富县| 忻城县| 蕲春县| 孝感市| 淳安县| 北安市| 金平| 两当县|