我从这篇回答中了解到关于C#中的for
和while
循环,其中提到:"只要在条件中使用arr.Length
,编译器/JIT就会对此进行优化:"
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?
}
我认为是的,那么呢?如果使用ArrayList
这样的Collection
会发生同样的情况吗?
但是,如果我必须在for循环的体内使用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();
}
}
编辑: 尽管我还没有得到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
是否也存在这样的优化呢?
System.currentTimeMillis()
方法获取当前时间的毫秒数。该方法返回自协调世界时1970年1月1日00:00:00至今所经过的毫秒数。示例代码:long now = System.currentTimeMillis();
请注意,这将返回自协调世界时(UTC)1970年1月1日00:00:00以来的毫秒数。 如果您需要本地时间而不是UTC时间,请考虑使用java.util.Date
和java.text.SimpleDateFormat
类。希望能对你有所帮助。 - SLaksarr.length
作为条件时不检查边界的优化呢? - Sнаđошƒаӽstd::vector
在operator[]
中根本不检查边界,因此没有什么可以优化的。 - StenSoft