日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

java单循环 比较得分_java – 为什么两个单独的循环比一个快?

發布時間:2023/11/27 生活经验 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java单循环 比较得分_java – 为什么两个单独的循环比一个快? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我想了解Java對連續循環做了什么樣的優化。更確切地說,我正在嘗試檢查是否執行了循環融合。

從理論上講,我期望這種優化不會自動完成,并且期望確認融合版本比具有兩個循環的版本更快。

但是,在運行基準測試之后,結果顯示兩個獨立(和連續)循環比完成所有工作的單個循環更快。

我已經嘗試使用JMH創建基準測試并獲得相同的結果。

我使用了javap命令,它顯示生成的具有兩個循環的源文件的字節碼實際上對應于正在執行的兩個循環(沒有循環展開或執行其他優化)。

為BenchmarkMultipleLoops.java測量的代碼:

private void work() {

List intermediate = new ArrayList<>();

List res = new ArrayList<>();

int totalLength = 0;

for (Capsule c : caps) {

if(c.getNumber() > 100000000){

intermediate.add(c);

}

}

for (Capsule c : intermediate) {

String s = "new_word" + c.getNumber();

res.add(s);

}

//Loop to assure the end result (res) is used for something

for(String s : res){

totalLength += s.length();

}

System.out.println(totalLength);

}

正在測量BenchmarkSingleLoop.java的代碼:

private void work(){

List res = new ArrayList<>();

int totalLength = 0;

for (Capsule c : caps) {

if(c.getNumber() > 100000000){

String s = "new_word" + c.getNumber();

res.add(s);

}

}

//Loop to assure the end result (res) is used for something

for(String s : res){

totalLength += s.length();

}

System.out.println(totalLength);

}

這是Capsule.java的代碼:

public class Capsule {

private int number;

private String word;

public Capsule(int number, String word) {

this.number = number;

this.word = word;

}

public int getNumber() {

return number;

}

@Override

public String toString() {

return "{" + number +

", " + word + '}';

}

}

caps是ArrayList< Capsule>在開頭填充了這樣的2000萬個元素:

private void populate() {

Random r = new Random(3);

for(int n = 0; n < POPSIZE; n++){

int randomN = r.nextInt();

Capsule c = new Capsule(randomN, "word" + randomN);

caps.add(c);

}

}

在測量之前,執行預熱階段。

我將每個基準測試運行了10次,換句話說,每個基準測試執行work()方法10次,完成的平均時間如下(以秒為單位)。每次迭代后,GC都會執行幾次睡眠:

> MultipleLoops:4.9661秒

> SingleLoop:7.2725秒

OpenJDK 1.8.0_144在Intel i7-7500U(Kaby Lake)上運行。

為什么MultipleLoops版本比SingleLoop版本更快,即使它必須遍歷兩個不同的數據結構?

更新1:

正如評論中所建議的那樣,如果我在生成字符串時更改實現以計算totalLength,從而避免創建res列表,則單循環版本會變得更快。

但是,只引入了該變量,以便在創建結果列表后完成一些工作,以避免在沒有對它們進行任何操作時丟棄這些元素。

換句話說,預期的結果是產生最終列表。但這個建議有助于更好地了解正在發生的事情。

結果:

> MultipleLoops:0.9339秒

> SingleLoop:0.66590005秒

更新2:

結果:

> MultipleLoops:7.397秒

> SingleLoop:8.092秒

總結

以上是生活随笔為你收集整理的java单循环 比较得分_java – 为什么两个单独的循环比一个快?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。