假设我有以下代码,有三个for循环来做某事。如果我将最外部的for循环更改为while循环,它会快速运行吗?谢谢~~
int length = 200;
int test = 0;
int[] input = new int[10];
for(int i = 1; i <= length; i++) {
for (int j = 0; j <=length - i; j++) {
for (int k = 0; k < length - 1; k++) {
test = test + input[j + k];
}
}
}
答案 0 :(得分:54)
不,改变循环的类型并不重要。
唯一可以使其更快的方法是减少循环嵌套,并循环使用较少的值。
for
循环和while
循环之间的唯一区别是定义它们的语法。根本没有性能差异。
int i = 0;
while (i < 20){
// do stuff
i++;
}
与:
相同for (int i = 0; i < 20; i++){
// do Stuff
}
(实际上for循环更好一点,因为i
将在循环后超出范围,而i
将在while
循环案例中保持不变。)< / p>
for循环只是一种语法更漂亮的循环方式。
答案 1 :(得分:31)
这种微观优化毫无意义。
答案 2 :(得分:10)
你不能通过改变它来优化它。
你可以通过改变线
来非常非常地增加速度for (int k = 0; k < length - 1; k++) {
通过
for (int k = 0; k < lengthMinusOne; k++) {
其中lengthMinusOne是在
之前计算的这个减法只是计算几乎(200x201 / 2)x(200-1)次,这对于计算机而言是非常少的数字:)
答案 3 :(得分:7)
有人建议测试while
vs for
循环,所以我创建了一些代码来测试while循环或for循环是否更快;平均而言,超过100,000次测试,while
循环更快〜95%的时间。我可能编码不正确,我对编码很新,还考虑到我是否只运行了10,000个循环,它们最终在运行持续时间内非常均匀。
编辑当我去测试更多试验时,我没有移动所有数组值。修正了它,以便更改您运行的试验次数。
import java.util.Arrays;
class WhilevsForLoops {
public static void main(String[] args) {
final int trials = 100; //change number of trials
final int trialsrun = trials - 1;
boolean[] fscount = new boolean[trials]; //faster / slower boolean
int p = 0; // while counter variable for for/while timers
while (p <= trialsrun) {
long[] forloop = new long[trials];
long[] whileloop = new long[trials];
long systimeaverage;
long systimenow = System.nanoTime();
long systimethen = System.nanoTime();
System.out.println("For loop time array : ");
for (int counter=0;counter <= trialsrun; counter++) {
systimenow = System.nanoTime();
System.out.print(" #" + counter + " @");
systimethen = System.nanoTime();
systimeaverage = (systimethen - systimenow);
System.out.print( systimeaverage + "ns |");
forloop[counter] = systimeaverage;
}
int count = 0;
System.out.println(" ");
System.out.println("While loop time array: ");
while (count <= trialsrun) {
systimenow = System.nanoTime();
System.out.print(" #" + count + " @");
systimethen = System.nanoTime();
systimeaverage = (systimethen - systimenow);
System.out.print( systimeaverage + "ns |");
whileloop[count] = systimeaverage;
count++;
}
System.out.println("===============================================");
int sum = 0;
for (int i = 0; i <= trialsrun; i++) {
sum += forloop[i];
}
System.out.println("for loop time average: " + (sum / trials) + "ns");
int sum1 = 0;
for (int i = 0; i <= trialsrun; i++) {
sum1 += whileloop[i];
}
System.out.println("while loop time average: " + (sum1 / trials) + "ns");
int longer = 0;
int shorter = 0;
int gap = 0;
sum = sum / trials;
sum1 = sum1 / trials;
if (sum1 > sum) {
longer = sum1;
shorter = sum;
}
else {
longer = sum;
shorter = sum1;
}
String longa;
if (sum1 > sum) {
longa = "~while loop~";
}
else {
longa = "~for loop~";
}
gap = longer - shorter;
System.out.println("The " + longa + " is the slower loop by: " + gap + "ns");
if (sum1 > sum) {
fscount[p] = true; }
else {
fscount[p] = false;
}
p++;
}
int forloopfc=0;
int whileloopfc=0;
System.out.println(Arrays.toString(fscount));
for(int k=0; k <= trialsrun; k++) {
if (fscount[k] == true) {
forloopfc++; }
else {
whileloopfc++;}
}
System.out.println("--------------------------------------------------");
System.out.println("The FOR loop was faster: " + forloopfc + " times.");
System.out.println("The WHILE loop was faster: " + whileloopfc + " times.");
}
}
答案 4 :(得分:2)
即使while循环的假设比for循环更快是真的(并且它不是),你必须改变/优化的循环不是外部的循环而是内部的循环,因为它们是执行次数更多。
答案 5 :(得分:2)
for和while之间的差异是语义:
这是一种帮助其他人理解您的代码的方法。您没有义务不修改循环变量,但这是一种常见的(也是很好的)实践。
答案 6 :(得分:2)
这是一篇关于此事的文章的有用link
根据它,While和For的速度几乎快两倍,但两者都相同。
但是这篇文章是在2009年写的,所以我在我的机器上试了一下,结果如下:
所以我想最好的事情就是把它放在你自己的版本和机器上,然后从那里得出结论
答案 7 :(得分:1)
不,你还在循环完全相同的次数。没关系。
答案 8 :(得分:1)
看看你的算法!您是否事先知道阵列中的哪些值被添加了多次?
如果您知道可以减少循环次数,那么可以提高性能。
答案 9 :(得分:0)
只有使用多线程或多处理器编程才有意义。那么它还取决于你如何将循环分配给各种处理器/线程。
答案 10 :(得分:0)
没有性能差异。试试吧!
JVM以及编译器将使两个循环成为类似
的循环 label:
;code inside your for loop.
LOOP label
答案 11 :(得分:0)
有没有人这样试过......
int i = 20;
while (--i > -1){
// do stuff
}
与:相比:
for (int i = 0; i < 20; i++){
// do Stuff
}
答案 12 :(得分:0)
答案 13 :(得分:0)
不,不会有什么大不同,唯一的是,如果嵌套循环可能需要考虑切换(例如出于组织目的),则可能需要在外部使用while循环并使用for语句在里面。这不会影响性能,但是只会使您的代码看起来更整洁/有条理
答案 14 :(得分:0)
您可以自己计算。
int length = 200;
int test = 0;
int[] input = new int[10];
long startTime = new Date().getTime();
for(int i = 1; i <= length; i++) {
for (int j = 0; j <=length - i; j++) {
for (int k = 0; k < length - 1; k++) {
test = test + input[j + k];
}
}
}
long endTime = new Date().getTime();
long difference = endTime - startTime;
System.out.println("For - Elapsed time in milliseconds: " + difference);
test = 0;
input = new int[10];
int i = 0, j = 0, k = 0;
startTime = new Date().getTime();
while(i < length) {
while(j <= length - i ) {
while(k < length - 1) {
test = test + input[j + k];
k++;
}
j++;
}
i++;
}
endTime = new Date().getTime();
difference = endTime - startTime;
System.out.println("While - Elapsed time in milliseconds: " + difference);
答案 15 :(得分:-1)
基于此:https://jsperf.com/loops-analyze(不是由我创建的)while循环通常比for循环慢22%。至少在Javascript中是。