Re: [請益] java的效能!?

看板Soft_Job作者 (lgd1008)時間14年前 (2011/05/24 13:59), 編輯推噓1(1017)
留言18則, 4人參與, 最新討論串42/52 (看更多)
※ 引述《Aurim (Who cares?)》之銘言: : ※ 引述《lgd1008 (lgd1008)》之銘言: : : 不要只把 VM, GC 算進 overhead, 而不同時考慮他們可能對效能產生的幫助, : 請試舉一例VM/GC對整體效能有幫助的例子。 : : CPU的指令己是VC++執行時的全部, 但並非 .net, Java執行時的全部 : 這句話在我聽來相當不切實際,莫非.net/java不需要CPU? : 凡是以CPU執行的,最後都是要用CPU的指令去跑的, : 中間多做事情只是多花時間的,跑愈多指令去做一件事只是用更多時間去完成那事。 : 就假設所有指令都可以在單個clock內完成的RISC來說,執行每個指令都只要1 cycle, : 所有演算法的時間複雜度直接與跑了多少個CPU指令在統計上就是絕對正相關。 : 你可以爭論說,GC可以在某種程度上改善你跑的演算法花在釋放記憶體的代價; : 但是整體觀之,那不過是朝三暮四的效果,該做的事情最後還是都要做,而且付出了 : 更大的效能代價去做,因為你還要多花時間去爬垃圾堆,看是不是該清垃圾了, : 而不是在垃圾丟出來時就馬上清掉。 : IKVM.net的作者都會常常關注Java VM JIT生出來的code與他的IKVM將Java bytecode : 轉成IL code再生成原生code後的指令數差距、對CPU管線利用率的影響了。 : : 會拿看起來 VM, GC 是 overhead 的情況去看 Java, .net : : 那怎麼不拿非 VM, GC 存在不可的情況去看 VC++ 呢? : : 如果你真的完全不想這種可能性, 應該早就值疑上篇測試的結果作假了.. : 前面有人留言說愈快的CPU上那overhead應該愈低,我說在單純只是時脈提升的情形下, : 因為要跑的CPU指令數沒變,總cycle數也不會因為CPU用比較快的clock跑就會減少, : 那overhead percentagle還是沒變-本來是5%的就還是5%,本來是30%的就還是30%, : 除非JIT的最佳化做得更好,減少產生出來的指令數,用跑更快的指令排列去應用CPU的 : 管線最佳化,不然在單純CPU時脈提升的情形下,這些overhead的比例根本不會降,只會 : 讓實質的絕對差距愈拉愈大-直接編譯成原生碼的軟體可以利用這愈拉愈大的差距來做 : 更多事。 : 表面上,你看到VM跑的code與編譯為原生碼程式間的執行時間差隨著機器變快而減少, : 可是能處理的工作量的增長是如何呢? : 為了方便計算,假設本來VM生出來的code跑一圈要2M cycle,編譯成原生碼跑一圈只要 : 1M cycle。在100MHz的CPU上執行時間比會是兩秒比一秒,在200MHz的CPU上會變成一秒 : 比半秒。你可以說,使用VM的語言與原生碼語言間的差距縮小了一倍,從一秒縮成半秒 : ;我也可以說,可是一樣的code在一秒內能處理的工作量差距拉大了,從本來的0.5件 : 比一件,變成一件比兩件,中間差距從0.5拉大到1。當CPU clock拉高到1GHz,這一秒內 : 可完成工作量的差距已經從100MHz時的0.5件工作拉大到1GHz的5件,中間差4.5件工作。 : 如果18個月後CPU時脈提高成2GHz,兩份code每秒完成工作量的差距會拉大到10件。 : 因為現實上看起來差距好像沒那麼大,所以對VM有著美夢的人還在繼續作夢。 : 5%的差距看起來好像沒什麼,可是已經足夠原生碼的新版程式多做一堆小動作了。 : 當這差距拉大到10%、20%、30%,又是個什麼樣的境地?你以為VM慢的真的只在IO與GC? : iOS device用的CPU現在確實是還不太快,Android device用的CPU也沒比較好到哪去。 : 以後CPU clock會繼續往上拉,也許VM派的人會想:這中間時間差距不是縮小了嗎? : 可是當我們回到現實看單位時間內能做的事情,原生碼能負擔的工作量成長比VM能做 : 的工作量成長要快,所以在許多小地方可以提供更好的表現。 : 那考慮CPU架構改善的場合,情形又是如何? : 如果JIT沒與時俱進的配合CPU的改良來生出最佳化的code,根本享受不到這方面的好處。 : C/C++編譯器都得改版來加入配合新CPU特性的最佳化功能了。 : 大家一樣是用ARM based CPU,各家做CPU的巧妙各有不同,Java JIT真能對各家ARM : based CPU應用各CPU獨家的最佳化技巧?指令怎麼排列的執行速度都有差了,還要一家 : 一種排法,慢慢等比較快。 : .NET起碼還可以在安裝時先把IL code executable編譯一遍存一份native code image, : 離線的最佳化可以做更多事,Windows on ARM也大可真的配合各家CPU來做這種時候的 : 最佳化。Java哪時候要照著玩這招? : 要不要把GPU與其他平行處理單元再考慮進來? 1. CPU指令不是執行的全部, 我應該改成, 你所寫下的程式指令, 並不是執行時的全部. 就如同一隻程式, 你在windows裡執行時的效能是A, 改成linux版時的執行效能是B, 執行 效能不一樣. why? 是什麼在影響? 是你選擇的OS影響了. OS會影響程式真正執行的方式 . 同樣的, 你對於 VM 的選擇採用也會影響真正執行方式, 就如同於你對不同 OS 的選擇 , 不同 API 的選擇. 2. GC 真的沒那麼罪惡, linux kernel 裡的 slab allocator 做的就是 GC 做的事, 也 許你早己在用只是沒有發現. 但它是一個簡單的版本, 因為對於kernel的環境, 設計者覺 得那樣夠用了. 而JVM裡的GC是一個更複雜的版本. GC 之類的行為, 只會成執行時 overhead? "朝三暮四" 地對於效能只減不增? 那也許你應該先問問 slab allocator 那 派人的說法, 若是背景相近的故事應該比較能說服你. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.43.9.124

05/24 14:51, , 1F
java慢不單是GC造成的. 大量使用動態記憶體配置,動態型別,
05/24 14:51, 1F

05/24 14:51, , 2F
,缺乏低階控制能力(當然你可以JNI,不過這就不是純Java)
05/24 14:51, 2F

05/24 14:52, , 3F
都是原因. 當然他的訴求就是簡單易用,所以也不能說他這樣
05/24 14:52, 3F

05/24 14:53, , 4F
子動態來動態去就不對.
05/24 14:53, 4F

05/24 14:55, , 5F
不過以簡單易用來說. 感覺.Net / C#魅力更高. 可惜跨平台
05/24 14:55, 5F

05/24 14:55, , 6F
能力目前還是沒有Java完善~
05/24 14:55, 6F

05/24 14:56, , 7F
但說起跨平台. 很可惜手持平台Java還是跨不過去(還是得用
05/24 14:56, 7F

05/24 14:57, , 8F
dx轉..而且還不一定都轉的過去~)
05/24 14:57, 8F

05/24 14:58, , 9F
google如果被oracle的專利戰惹毛了,搞不好以後連language
05/24 14:58, 9F

05/24 14:58, , 10F
層的標準都會分裂掉了說..
05/24 14:58, 10F

05/24 15:22, , 11F
「魅力更高」的論述是以哪個方向來說啊...
05/24 15:22, 11F

05/24 15:22, , 12F
以現有的lib , framework 的廣度跟支援程度來講 , 我覺得還
05/24 15:22, 12F

05/24 15:22, , 13F
很有得比啊...
05/24 15:22, 13F

05/24 17:38, , 14F
T大~f大說了:以"簡單易用"來說 只不過簡單易用也就那樣了
05/24 17:38, 14F

05/24 17:39, , 15F
真的要深入~該學的東西~一個都少不了...
05/24 17:39, 15F

05/24 20:11, , 16F
問題是絕大多數的狀況下不是「簡單易用的功能」能解決的啊
05/24 20:11, 16F

05/24 20:11, , 17F
這樣還能說是簡單易用嗎 ~_~a
05/24 20:11, 17F

05/24 22:33, , 18F
不單是OS,compiler影響也很多,CPU架構跟設計也有差
05/24 22:33, 18F
文章代碼(AID): #1Dsqb6Ej (Soft_Job)
討論串 (同標題文章)
文章代碼(AID): #1Dsqb6Ej (Soft_Job)