Я новичок Java-ученик. Я пытаюсь понять, как писать эффективные коды с точки зрения производительности и удобочитаемости. На данный момент массивы для меня были загадкой. Ниже приведены шесть примитивных тестов. Первые три и три три возвращаются почти в одно и то же время. Пожалуйста, объясните, что происходит.Какая из них быстрее в производительности цикла петли?
String s= "";
int[] Array1=new int[100000];
Long startingTime=System.nanoTime();
for (int i = 0; i < Array1.length; i++) {
s+=i;
}
System.out.println("time : " + (System.nanoTime()-startingTime));
String s= "";
int length=100000;
Long startingTime=System.nanoTime();
for (int i = 0; i < length; i++) {
s+=i;
}
System.out.println("time : " + (System.nanoTime()-startingTime));
String s= "";
int length1=50000;
int length2=50000;
Long startingTime=System.nanoTime();
for (int i = 0; i < length1+length2; i++) {
s+=i;
}
System.out.println("time : " + (System.nanoTime()-startingTime));
public class Test3Length {
static class Foo {
int mSplat = 0;
}
public static void main(String[] args) {
int twentyMillions = 20000000;
Foo[] mArray = new Foo[twentyMillions];
for (int i = 0; i < mArray.length; i++) {
mArray[i] = new Foo();
}
int sum = 0;
Long startingTime = System.nanoTime();
for (int i = 0; i < mArray.length; ++i) {
sum += mArray[i].mSplat;
}
System.out.println("time : " + (System.nanoTime() - startingTime));
}
}
public class Test4Length {
static class Foo {
int mSplat = 0;
}
public static void main(String[] args) {
int twentyMillions = 20000000;
Foo[] mArray = new Foo[twentyMillions];
for (int i = 0; i < mArray.length; i++) {
mArray[i] = new Foo();
}
int sum = 0;
Long startingTime = System.nanoTime();
for (int i = 0; i < twentyMillions; ++i) {
sum += mArray[i].mSplat;
}
System.out.println("time : " + (System.nanoTime() - startingTime));
}
}
public class Test5Length {
static class Foo {
int mSplat = 0;
}
public static void main(String[] args) {
int twentyMillions = 20000000;
Foo[] mArray = new Foo[twentyMillions];
for (int i = 0; i < mArray.length; i++) {
mArray[i] = new Foo();
}
int sum = 0;
Long startingTime = System.nanoTime();
for (Foo a : mArray) {
sum += a.mSplat;
}
System.out.println("time : " + (System.nanoTime() - startingTime));
}
}
Первый вопрос, предпочитаю ли я int length
в условиях отсутствия контура, а не array.length
?
Второй вопрос, предпочитаю ли я цикл foreach
, а не цикл for, если массив не является коллекцией?
Беспокойство относительно удобочитаемости, а не эффективности; [Преждевременная оптимизация - корень всего зла] (http://c2.com/cgi/wiki?PrematureOptimization). – azurefrog
@azurefrog: Как вы знаете, что эта оптимизация преждевременна? Возможно, это код, который OP правильно профилирован и идентифицирован как бутылочная шее. Бывают моменты, когда важна производительность, и научиться ее выводить, безусловно, важно. – Dolda2000
@ Dolda2000 Поскольку вопрос OP начинается с '' я новичок Java-ученика. '', Я предположил, что это не так. – azurefrog