我從this answer上for
和while
循環在C#中有學問:「編譯器/ JIT對這種情況下的優化,只要您在使用arr.Length
條件:」編譯器的邊界檢查/ JIT優化Java中環和C++
for(int i = 0 ; i < arr.Length ; i++) {
Console.WriteLine(arr[i]); // skips bounds check
}
這個誘惑我懷疑,如果java編譯器有這樣的優化。
for(int i=0; i<arr.length; i++) {
System.out.println(arr[i]); // is bounds check skipped here?
}
我認爲它的確如此嗎?使用Collection
如ArrayList
時會發生同樣的情況嗎?
但是如果我不得不使用的myList.size()
值身體的for循環裏面,現在正在考慮myList
是一個ArrayList?所以在那種情況下不會myList.size()
幫忙,因爲size()
是一個方法調用嗎?例如可以是這樣的:
int len = myList.size(); // hoisting for using inside the loop
for(int i = 0; i < myList.size(); i++) { // not using hoisted value for optimization
System.out.println(myList.get(i));
if(someOtherVariable == len) {
doSomethingElse();
}
}
編輯: 雖然我還沒有得到Java的一個答案,我仍然將第二部分對這一問題。
問: C++(C++ 98/C++ 11)有這樣的優化,例如:爲vector.size()
和string.size()
?例如,哪種性能更好?
for (int i = 0; i < myvector.size(); ++i)
cout << myvector[i] << " "; // is bounds checking skipped here, like in C#?
或
// does this manual optimisation help improve performance, or does it make?
int size = myvector.size();
for (int i = 0; i < size; ++i)
cout << myvector[i] << " ";
這就是說,沒有這樣的優化std::string
存在呢?
不用擔心;無論如何,方法調用通常都會內聯。 – SLaks
@SLaks可以請你詳細介紹一下內聯嗎? –
http://stackoverflow.com/q/1546694/34397 – SLaks