各位大神好,小弟今天測驗了一下JDK8中的foreach和傳統的泛型foreach回圈,本以為他倆會差不多,結果是JDK8的foreach遠遠不如以前的泛型foreach回圈,那么它為什么還要出現??測驗代碼很簡單
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
for(int i=0;i<100000;i++){
list.add("a");
}
long a=System.currentTimeMillis();
for(String action:list){
if(action==null){
//什么都不干,就判斷一下而已
}
}
long b=System.currentTimeMillis();
System.out.println(b-a);//傳統的foreach時間1
list.forEach(action->{
if(action==null){
//什么都不干,就判斷一下而已
};
});
long c=System.currentTimeMillis();
System.out.println(c-b);//JDK8的時間2
}
控制臺列印的時間,JDK8耗時是傳統foreach的好幾十倍,求大神解釋
uj5u.com熱心網友回復:
ArrayList不推薦使用foreach,陣列和 其它集合可以使用。這是我在《進擊的Java》里面看到的。uj5u.com熱心網友回復:
抱歉看錯了問題了。
uj5u.com熱心網友回復:
forEach和foreach
uj5u.com熱心網友回復:
試著 講你的測驗資料 擴大三個數量級呢uj5u.com熱心網友回復:
沒記錯的話,jdk8的朗母達運算式性能是不如傳統書寫方式的。至于為何要出現的問題,jdk的api和語法又不是維了效率做極致優化的。
從理論上來說面向物件的編程,性能相對面向程序肯定是降低的,但是可維護性或清晰度有了很大的提升。
所以一個特性用于不用,取決于你關注什么,當公司給你半年時間去做功能實作的時候,顯然不會有人花3個月去做性能優化,這時候更清晰合理的代碼就很重要了,大多數時候性能問題不是來自于演算法和api表現平庸,而是出自各種系統bug。
uj5u.com熱心網友回復:
這里有解釋https://blog.csdn.net/u_ascend/article/details/80777033uj5u.com熱心網友回復:
foreach是為了優化編程人員撰寫代碼的效率,而不是為了代碼的運行效率。一種編程語言不僅僅要考慮代碼的運行效率,還要綜合考慮各種因素,例如代碼撰寫效率。
就好比現在大行其道的是python,它的運行效率更是低得令人發指,但是它優秀的撰寫效率還有入門簡易性還是在不斷的提高他的人氣
如果你喜歡單純高性能的代碼。
那么匯編和C語言是最快的吧,c++應該能如你所愿了
uj5u.com熱心網友回復:
lambda使代碼簡潔,與stream搭配使用,能充分利用多核,實作真正的并行,如果資料量不大,只能起到簡化代碼的作用,性能方面并沒有太突出的優勢,甚至會比for回圈差,因為程式第一次使用lamda的時候需要初始化一些lambda框架的東西,這些也要花費時間,而for回圈就不需要這些時間開銷,上來就能執行。當迭代的資料量大的時候,lambda性能優勢就體現出來了uj5u.com熱心網友回復:
你試驗一下在回圈里面做點事。比如sleep(100);
你就會發現,lamda的foreach是多執行緒處理的。
雖然啟動上確實慢了很多(畢竟跑執行緒池),但并發處理會讓整體結果速度提升。
尤其在回圈呼叫遠程介面,或者回圈訪問資料庫的時候會有特別明顯的提升。
uj5u.com熱心網友回復:
提示一點,不是list.forEach()
而是list.parallelStream().forEach()
如果是list.forEach(),效率沒什么影響,就是換個寫法而已。
uj5u.com熱心網友回復:
1萬資料量 foreach 慢6ms5萬資料 foreach 快3ms
10萬資料 foreach快32ms
100萬資料 foreach快93ms
uj5u.com熱心網友回復:
假如你的類中,需要多次for回圈,java8 forEach 會比增強for回圈,性能高,因為其設計需要預熱uj5u.com熱心網友回復:
不能這么看的,這兩段代碼底層實作一模一樣,不是JDK8耗時是傳統foreach的好幾十倍,而是多100ms而已你集合再大一點,耗時也是多100ms
uj5u.com熱心網友回復:
資料量的大小會影響到回圈的適應轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/80270.html
標籤:Java相關
