我正在努力提高Java程序的性能.在我改进了data structures算法的复杂性之后,我正在努力改进实现.我想知道if在条件中如何使用语句真的很重要.
编译器是否将这两个版本视为相同?它们的成本是否相同(如果我在if语句中有更多变量)?
if(a && b && c && d && e && f && g)
Run Code Online (Sandbox Code Playgroud)
要么
if(a)
if(b)
if(c)
if(d)
if(e)
if(f)
if(g)
Run Code Online (Sandbox Code Playgroud)
(在这个特定的项目中,我并不关心可读性,我知道第二个不太可读)
Jes*_*per 22
的&&操作者(以及||)是短路在Java中操作.
这意味着,如果a是false,Java不评估b,c,d等,因为它已经知道整个表达式a && b && c && d && e && f && g将是false.
因此,将您的内容编写if为一系列嵌套if语句没有任何好处.
优化性能的唯一好方法是使用分析器测量程序的性能,确定实际性能瓶颈的位置,并尝试改进代码的这一部分.通过检查代码和猜测进行优化,然后应用微优化通常不是一种有效的优化方法.
And*_*ter 10
除了其他答案之外,即使在非常低的水平上,两种方法之间也没有区别 - 它们被编译成相同的字节码:
boolean a=true, b=true, c=true, d=true, e=true, f=true, g=true;
0: iconst_1
1: istore_1
2: iconst_1
3: istore_2
4: iconst_1
5: istore_3
6: iconst_1
7: istore 4
9: iconst_1
10: istore 5
12: iconst_1
13: istore 6
15: iconst_1
16: istore 7
if(a && b && c && d && e && f && g) {}
18: iload_1
19: ifeq 45
22: iload_2
23: ifeq 45
26: iload_3
27: ifeq 45
30: iload 4
32: ifeq 45
35: iload 5
37: ifeq 45
40: iload 6
42: ifeq 45
if(a) if(b) if(c) if(d) if(e) if(f) if(g) {}
45: iload_1
46: ifeq 72
49: iload_2
50: ifeq 72
53: iload_3
54: ifeq 72
57: iload 4
59: ifeq 72
62: iload 5
64: ifeq 72
67: iload 6
69: ifeq 72
Run Code Online (Sandbox Code Playgroud)
在分析用任何语言编写的程序时,不要只关注语言结构,而要关注代码的作用.计算代码的时间,找出花费的时间,然后你会知道原因是什么,因为它会缩小.
如果您知道程序的缓慢部分在if语句中,那么您已经知道问题的答案.
我发布这个作为答案,因为我认为为优化目的询问特定语言功能的效率完全是错误的方法,我相信你会受益于一个非常不同的策略.
此外,某些实现可能会稍微不同地处理事情,因此除非在标准中设置一些东西(有时甚至不能保证),否则答案可能是依赖于实现的,并且是有条件的.
| 归档时间: |
|
| 查看次数: |
3176 次 |
| 最近记录: |