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 – 为什么两个单独的循环比一个快?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个霸气超拽搞笑个性签名!
- 下一篇: java的重点是什么_你知道初学者学习J