Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于循环有效工作的两个问题 1.假设以下情况。_Java_Performance - Fatal编程技术网

Java 关于循环有效工作的两个问题 1.假设以下情况。

Java 关于循环有效工作的两个问题 1.假设以下情况。,java,performance,Java,Performance,第一名: int x; for (int i = 0; i < MAX; i++){ // some magic with x System.out.println(x); } for (int i = 0; i < MAX; i++){ int x; // some magic with x System.out.println(x); } int size = array.length; for (int i = 0; i < s

第一名:

int x;
for (int i = 0; i < MAX; i++){
    // some magic with x
    System.out.println(x);
}
for (int i = 0; i < MAX; i++){
    int x;
    // some magic with x
    System.out.println(x);
}
int size = array.length;
for (int i = 0; i < size; i++) {
    // do something with array[i]
}
for (int i = 0; i < array.length; i++) {
    // do something with array[i]
}
intx;
对于(int i=0;i
秒:

int x;
for (int i = 0; i < MAX; i++){
    // some magic with x
    System.out.println(x);
}
for (int i = 0; i < MAX; i++){
    int x;
    // some magic with x
    System.out.println(x);
}
int size = array.length;
for (int i = 0; i < size; i++) {
    // do something with array[i]
}
for (int i = 0; i < array.length; i++) {
    // do something with array[i]
}
for(int i=0;i
那么,哪段代码更好、更高效呢

2.另外两种情况。 第一名:

int x;
for (int i = 0; i < MAX; i++){
    // some magic with x
    System.out.println(x);
}
for (int i = 0; i < MAX; i++){
    int x;
    // some magic with x
    System.out.println(x);
}
int size = array.length;
for (int i = 0; i < size; i++) {
    // do something with array[i]
}
for (int i = 0; i < array.length; i++) {
    // do something with array[i]
}
int size=array.length;
对于(int i=0;i
秒:

int x;
for (int i = 0; i < MAX; i++){
    // some magic with x
    System.out.println(x);
}
for (int i = 0; i < MAX; i++){
    int x;
    // some magic with x
    System.out.println(x);
}
int size = array.length;
for (int i = 0; i < size; i++) {
    // do something with array[i]
}
for (int i = 0; i < array.length; i++) {
    // do something with array[i]
}
for(int i=0;i

将数组长度保存到变量是否更有效?

length
只是数组对象中的一个属性,它不需要花费任何时间来获取长度

它与读取变量相同它不需要在整个数组上循环以获得长度

前两个只是范围

本地-仅在循环中可用

全球-可通过


假设你想要数字的余数除以2

for(int i = 0; i < 10; ++i)
{
 int remainder = i % 2;
 System.out.println(remainder);
}
for(int i=0;i<10;++i)
{
整数余数=i%2;
系统输出打印项次(余数);
}
假设计算前10个自然数的和

int sum = 0;
for(int i = 0; i <= 10; ++i)
 {
    //declaring sum here doesnt make sense
     sum += i;
 } 
System.out.println(sum);//sum is available here.
int和=0;

对于(int i=0;i1.您在这里应该更关心的不是效率,而是范围。通常,您应该尽量保持变量的局部范围。这意味着,如果您在循环中只需要x,那么您应该在循环中定义它

将变量保持在尽可能局部的范围内,可以获得许多好处:

  • 您的代码对其他人的可读性会更好
  • 您不会意外地分配或使用您在代码中进一步定义的仍在范围内的变量的值,从而最大限度地减少程序中的错误
  • 最重要的是,垃圾收集器将在变量超出范围时立即释放它使用的所有内存,从而保持程序的高性能和低内存使用率
您可以从Josh Bloch的优秀著作《范围在第13项和第45项中进行了讨论》中阅读更多关于可变范围和最佳实践的内容。您还可以阅读第55项,其中讨论了为什么选择范围很重要

2.关于问题的第二部分,请参见双向飞碟的答案

下面是一个例子:

public static void main(String[] args) {
    for(int i=0; i<getSize(); i++) {
        System.out.println("i: " + i);
    }
}

private static int getSize() {
    int size = new Random().nextInt(10);
    System.out.println("size: " + size);
    return size;
}
请注意循环的每次迭代都是如何调用
getSize()
。在您的示例中,调用
.length
不会有很大的区别,因为JIT运行时将知道如何优化此调用。但是请想象一下
getSize()
是一个更复杂的操作,比如计算数据库表中的行数。循环的每次迭代都会调用
getSize()
,导致数据库往返,因此代码的速度会非常慢

此时,您最好先评估值。您可以这样做,并且仍然保留
大小的最小范围,如下所示:

public static void main(String[] args) {
    for(int size = getSize(), i=0; i<size; i++) {
        System.out.println("i: " + i);
    }
}


private static int getSize() {
    int size = new Random().nextInt(10);
    System.out.println("size: " + size);
    return size;
}

size: 5
i: 0
i: 1
i: 2
i: 3
i: 4
publicstaticvoidmain(字符串[]args){

对于(int size=getSize(),i=0;它们是等价的。这对于任何编译器来说都是小菜一碟。对于第二种情况,如果是列表,第一种情况会更有效。不要像那样考虑效率。你应该更担心变量的范围(e.x.1)还有可读的代码。还有一些优化编译器的东西1。没有一个更好,因为
x
是一个糟糕的变量名2。没有一个更好,因为快速枚举具有更多的意图。你知道循环中的
println
比循环中发生的任何事情都要多出许多数量级吗
case保证变量不是循环携带的依赖链的一部分,这很有用。但是,让变量在循环迭代中保持不变可以使强度从乘法降低到加法:
int scaled=i*5
vs.
i+=5
我了解所有这些。但我只对这两种情况感兴趣:)很好的观点!这是真的。谢谢。所以还是不一样。局部变量更受欢迎。是的,局部变量更受欢迎,除非for循环中的计算条件进行了一些复杂的计算或数据库查找。在这种情况下,最好在循环之前将其分配给一个变量。你能用复杂的计算解释这种情况吗伊恩?我不太明白你的意思。。。