я узнал от 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()
внутри тела из цикла, принимая во внимание в настоящее время 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();
}
}
Edit: Хотя я не получил ответа на Java, я все еще добавить вторую часть на этот вопрос.
Q: Имеет ли 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