将最可能的真实条件放在if,else-if或else中有什么不同

时间:2014-09-01 11:51:02

标签: java time-complexity execution

将最可能的条件放入if,else-if或else条件

是否有任何区别

前:

int[] a = {2,4,6,9,10,0,30,0,31,66}
int firstCase = 0, secondCase = 0, thirdCase = 0;
for( int i=0;i<10;i++ ){
    int m = a[i] % 5;
    if(m < 3) {
        firstCase++;
    } else if(m == 3) {
        secondCase++;
    } else {
        thirdCase++;
    }
}

执行时间与输入

的区别是什么
int[] a = {3,6,8,7,0,0,0,0,0,0}

7 个答案:

答案 0 :(得分:6)

  

在if,else-if或else条件

中放置最可能的真实条件是否有任何不同之处

实际上,Java的答案是“它取决于”。

您可以看到,当您运行Java代码时,JVM会在收集统计信息时使用解释器启动。可以记录的统计之一是最常采用分支指令中的哪些路径。这些统计信息可以然后由JIT编译器用来影响代码重新排序,这不会改变编译代码的语义。

因此,如果您使用两个不同的数据集(即“大多数为零”和“大多数非零”)执行代码,则JIT编译器可能会以不同方式编译代码。

是否可以实际进行此优化取决于它是否能够确定重新排序是否有效。例如,它可以推断出被测试的条件是互斥的吗?


那么这对复杂性有何影响?好吧......让我们为简化的例子做总结,假设JIT编译器没有做任何“智能”的事情。并假设我们不只是处理长度为10的数组(这使得复杂性的讨论没有实际意义)。

考虑一下:

  • 对于每个零,循环执行一次测试和一次增量 - 比如说2次操作。

  • 对于每个非零元素,循环执行两次测试和一次增量 - 比如说3次操作。

因此,当所有零运算与3 * N运算完全非零时,N个元素的运算大致为2 * N.但两者都是O(N) ......因此Big O复杂性不受影响。

(好吧,我留下了一些东西......但是你得到了照片。其中一个案例会更快,但复杂性不受影响。)

答案 1 :(得分:4)

这比你被告知要多一点。

  1. &#39;如果&#39;与&#39;否则&#39;:如果一个条件及其相反的可能性不同,你应该处理“其他条件”中更可能的条件。阻止,而不是&#39;如果&#39;块。 &#39;如果&#39;阻止需要一个没有条件的跳跃,并且需要一个围绕“其他”的最终分支。块; &#39;其他&#39; block需要一个条件分支,而且根本没有最终分支。

  2. &#39;如果&#39;与&#39;否则如果&#39;与&#39;其他&#39;:显然你应该处理最常见的情况,如果&#39;阻止,避免第二次测试。与(1)中相同的考虑因素确定了最终情况之间的更常见情况,否则如果&#39;而最终的其他&#39;应该在最后的“其他”中处理。块。

  3. 说了这么多,除非测试是非平凡的,或者所有这些块的内容都是微不足道的,否则任何一个块都不太可能产生明显的差异。

答案 2 :(得分:2)

如果您只有if-else,则没有区别,因为条件将始终被评估,并且它是否几乎总是真或假并不重要。但是,如果if部分(else)中有else if,那么最好将最可能的真实条件放在第一个if中。因此,大多数情况下,您不需要评估else内的条件,从而提高性能。

答案 3 :(得分:2)

如果大多数条件为真,那么执行时间会更短。因为在第一个if条件下只有它满足。

如果if-else中的大多数条件都为真,那么执行时间将比最后一次更多,而且比第一种情况更多。

如果大多数条件在else中都为真,则执行时间会更长。因为它会检查前两个条件。

答案 4 :(得分:2)

当然可以。

if ... else if ...检查按照编码的顺序进行。因此,如果您将最大可能的条件放在此条件检查队列的末尾 - 这样的代码将稍微慢一些。

但这一切都取决于如何建立这些条件(它们有多复杂)。

答案 5 :(得分:1)

最可能的条件应该是if和then if else等等。

答案 6 :(得分:1)

在第一级编写最常见的条件是好的,这样如果该条件为真或假,将在较短的时间内首先处理。

如果你把最频繁的条件放在中间(else..if)或last(else),那么到达那个条件语句需要时间,因为它需要检查每个条件语句。