2

The question being thought today while completing my task is about the loop efficiency..

Lets say. I have an array {'a','x','a','a'} And a loop that should avoid 'x' element Now i wonder how these two approach differ in term of efficiency - not taking the while or do-while or for loops differentiation

char[] arrExample = {'a','x','a','a'};
for(int idx = 0; idx<arrExample.length; idx++){
    if(arrExample[idx] == 'x')
        continue;

    System.out.println(arrExample[idx]);
}

and the common loop look like this

char[] arrExample = {'a','x','a','a'};
for(int idx = 0; idx<arrExample.length; idx++){
    if(arrExample[idx] != 'x')
        System.out.println(arrExample[idx]);
}

so.. expert comments are pleased. Thanks!

4

7 回答 7

5

即使您使用未优化的字节码,它也几乎相同。只有两个真正的区别。首先是跳转语句的放置,但该跳转语句仍将执行相同的次数。此外, == 和 != 运算符都是原子运算符,执行两者所需的时间相同。

如前所述,使用对您有意义的任何东西。但我不得不承认,继续声明版本读起来相当尴尬。

于 2010-10-08T05:21:51.277 回答
3

除非您已根据实际输入分析您的应用程序,并确定此特定循环需要大量时间,否则您不必担心在此级别手动优化您的代码:

  • 很有可能这个特定的循环对整体性能并不重要。
  • 您正在考虑的更改可能不会产生任何影响。
  • 即使是这样,最有效的代码也有可能取决于硬件平台和 JVM 版本。(JIT 编译器不断得到改进。)

事实上,Sun 的人已经说过,通过以复杂的方式编写代码,实际上会使 JIT 优化器难以做好工作。因此,虽然一些手动优化可能会提高一个 JVM 版本的性能,但同样的优化实际上可能会使另一个版本的性能更差。

于 2010-10-08T05:16:46.293 回答
3

优化编译器将为两者生成基本相同的指令。使用对您更有意义的那个。

于 2010-10-08T04:59:05.710 回答
3

我会说,如果您对此感到担忧,那么您的水平太低了。奇怪的是没有明显的差异。

我对编码的偏好通常不会使用 continue 而是使用 != ,因为它往往会导致更好的代码......但这并不总是正确的。

除非速度被证明是一个问题,否则更喜欢代码清晰/漂亮而不是速度。

于 2010-10-08T05:00:57.470 回答
2

性能方面你看不出有太大的区别,但第二个看起来很可读。

即使存在(非常小的)性能差异,我也会选择第二个。

于 2010-10-08T05:30:12.330 回答
1

如果您真的非常关心这个循环的效率,那么在我看来,您有两个选择:

  • 测量它(在您关心的平台上)
  • 检查生成的字节码,看看哪个更有效。

但实际上,正如 Amber 指出的那样,您应该使用半体面的编译器获得相同的字节码。所以使用任何感觉更清晰的东西。对我来说,尤其是对于 if 的主体稍大的情况, continue 会让它更清晰。

于 2010-10-08T05:05:17.427 回答
0

两个循环的复杂性是相等的,它们都不会给你带来显着的差异。我个人不想为了节省一些微秒而牺牲代码的可读性。

假设您选择上述实现之一。不同的编译器会产生不同的优化,您的“微秒节省”可能会消失。

在代码可读性方面,我更喜欢没有“继续”或“中断”的那个。

于 2012-06-01T08:09:41.897 回答