我有一個關於Sun JDK中提供的Java編譯器如何「聰明」的快速問題。具體來說,是否足夠聰明,可以提前評估出現在for()循環的條件部分中的任何函數,而不是在循環的每次迭代中對它們進行評估?Java控制結構中的自動編譯器優化?
例如,請考慮以下代碼。
// Array of doubles to "hold" the array.
private double matrix[][];
public int getCols() {
// Compute the number of columns in a matrix.
}
public int getRows() {
// Compute the number of rows in a matrix.
}
// Compute the sum of all elements in the matrix.
public double sum() {
double result = 0;
for (int r = 0; r < getRows(); r++) {
for (int c = 0; c < getCols(); c++) {
result += this.matrix[r][c];
}
}
return result;
}
顯然,我可以修改的總和()方法來確保該GetRows的()和getCols()在循環的每一次迭代中,通過改變它不被評估以
public double sum() {
double result = 0;
int numRows = getRows();
int numCols = getCols();
for (int r = 0; r < numRows; r++) {
for (int c = 0; c < numCols; c++) {
result += this.matrix[r][c];
}
}
return result;
}
不過,我想知道,如果編譯器足夠聰明,可以預先評估它們本身。也就是說,它是否會自動發現評估出現在條件中的任何函數在計算上更便宜,而不是在每次迭代中評估它們?
謝謝!
我對此表示懷疑,因爲推斷狀態依賴性會帶來很大的收益,但爲什麼不使用數組的長度屬性?你當前的設置有點脆弱,因爲它隱含地假定所有行具有相同數量的列。 – Taylor