哪个在数组循环性能上更快?
Which one is faster in array loop performance?
我是新手 Java 学习者。我试图了解如何在性能和可读性方面编写高效的代码。在这一点上,数组对我来说一直是个谜。下面是六个原始测试。他们的前三个和后三个 return 几乎相同。请解释这是怎么回事。
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));
}
}
第一个问题,在for循环条件下我更喜欢int length
而不是array.length
吗?
第二个问题,除非数组是集合,否则我更喜欢 foreach
循环而不是 for 循环吗?
在现实生活中,使用 foreach 还是 for 循环并不重要。性能差异几乎不可察觉。如果您需要当前索引,则执行 for 循环,如果不需要,则执行 foreach。至于长度,它只是一个属性,因为它是一个数组,所以它在数组初始化时设置并且永远不会改变。读取 属性 的值几乎不需要任何时间。因此为了便于阅读,将它放在 for 循环的条件
中
First question, would I prefer to int length
in for-loop condition rather than array.length
?
从字面上看,这没有什么区别。 array.length
是不变量,因此 JIT 无论如何只会访问它一次,使其值在性能方面与局部变量相同。
Second question, would I prefer a foreach
loop rather than for-loop unless array is collection?
当循环的对象是数组时,foreach 循环的翻译与 for 循环相同,因此没有任何区别。
但是,总而言之,我应该说您似乎关注了错误的事情。在您的前三个测试中,几乎所有 运行 时间都可能花在 s+=i
表达式上,因为每个评估都会创建一个新的 String
以便添加 i
给它。通过使用 StringBuilder
而不是尝试循环结构的不同变体,您可能会看到更大幅度的加速。
我是新手 Java 学习者。我试图了解如何在性能和可读性方面编写高效的代码。在这一点上,数组对我来说一直是个谜。下面是六个原始测试。他们的前三个和后三个 return 几乎相同。请解释这是怎么回事。
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));
}
}
第一个问题,在for循环条件下我更喜欢int length
而不是array.length
吗?
第二个问题,除非数组是集合,否则我更喜欢 foreach
循环而不是 for 循环吗?
在现实生活中,使用 foreach 还是 for 循环并不重要。性能差异几乎不可察觉。如果您需要当前索引,则执行 for 循环,如果不需要,则执行 foreach。至于长度,它只是一个属性,因为它是一个数组,所以它在数组初始化时设置并且永远不会改变。读取 属性 的值几乎不需要任何时间。因此为了便于阅读,将它放在 for 循环的条件
中First question, would I prefer to
int length
in for-loop condition rather thanarray.length
?
从字面上看,这没有什么区别。 array.length
是不变量,因此 JIT 无论如何只会访问它一次,使其值在性能方面与局部变量相同。
Second question, would I prefer a
foreach
loop rather than for-loop unless array is collection?
当循环的对象是数组时,foreach 循环的翻译与 for 循环相同,因此没有任何区别。
但是,总而言之,我应该说您似乎关注了错误的事情。在您的前三个测试中,几乎所有 运行 时间都可能花在 s+=i
表达式上,因为每个评估都会创建一个新的 String
以便添加 i
给它。通过使用 StringBuilder
而不是尝试循环结构的不同变体,您可能会看到更大幅度的加速。