关于循环高效工作的两个问题

索洛金

1.假设以下情况。

第一的:

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);
}

那么哪段代码更好,更高效?

2.另外两种情况。

第一的:

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]
}

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

Jeshurun

1.在这里您应该更加关注的不是效率,而是范围。通常,您应该努力使变量尽可能在本地范围内。这意味着,如果仅在循环内需要x,则应在循环内定义x。

通过使变量尽可能在本地范围内,您会获得许多好处:

  • 您的代码将对其他人更具可读性
  • 您不会意外分配或使用仍在范围内的代码中进一步定义的变量的值,从而最大程度地减少程序中的错误
  • 最重要的是,垃圾回收器将在变量超出范围后立即释放该变量使用的所有内存,从而使程序的性能保持较高,而内存使用率却保持较低。

您可以从Josh Bloch的出色著作“ Effective Java ”(有关作用域的第13和45节中讨论)中了解更多有关可变范围和最佳实践的信息您可能还想阅读第55项,其中讨论了明智地进行优化的重要性

2.对于问题的第二部分,请参见此处的The Skeet答案

这是一个例子:

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;
}

输出:

size: 2
i: 0
size: 4
i: 1
size: 4
i: 2
size: 8
i: 3
size: 0

注意getSize()循环的每次迭代如何调用。在您的示例中,调用.length不会有太大的区别,因为JIT运行时将知道如何优化此调用。但是想象一下,这getSize()是一个更复杂的操作,例如计算数据库表中的行数。您的代码将非常慢,因为循环的每次迭代都会调用getSize(),从而导致数据库往返。

在这种情况下,您最好事先进行评估。您可以这样做,并且仍然保留的最小范围size,如下所示:

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

注意如何getSize()仅被调用一次,并且size变量仅在循环内可用,并且在循环完成后就超出范围。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

关于火焰引擎的两个问题

结合两个foreach循环以提高效率?

log4cpp:关于SIGSEGV的两个问题

关于指针和引用的两个简短问题

Ansi:关于这个词的两个快速问题

关于两个表的联接的Spark性能问题

关于SOIL,OpenGL和GLUT的两个问题

C ++关于两个类构造函数的问题

关于* nix tr命令的两个问题

关于回形针多次上传的两个问题

关于从另外两个创建表的 SQL 问题

我的问题是关于 OR 运算符在 SQL 中的工作,是否可以用于组合两个选择查询

在python中同时循环两个for循环的问题

使用两个foreach循环无法工作而爆炸

在 for 循环中使用两个变量如何工作

两个不同的for循环之间的Printf无法正常工作

Python - 比较两个列表时出现循环问题

解决我在两个插件之间的循环依赖问题

在17.10上有两个显示问题的工作区

关于在组内和时间上产生滞后的两个问题

关于导入两个具有相同名称的类的问题-android.graphics.Color

关于内核中的copy_pte_range()的两个问题

关于Java内部类的两个问题(类A {类B {}})

这两个代码块之间关于setTimeout问题的区别

关于自联接的问题。查看两个用户是否交互

关于ggplot2 R散点图的两个问题,带有数据标签

关于Lambda与boost :: adaptors :: filtered()结合使用的两个问题

关于使用Laravel和Vue.js的具有两个框架的API的问题

关于查找两个日期时间变量之间差异的问题*更新*