Java 将最可能的真实条件置于if、else if或else中有什么不同

Java 将最可能的真实条件置于if、else if或else中有什么不同,java,time-complexity,execution,Java,Time Complexity,Execution,在if、else if或else条件中放置最可能的条件是否有任何区别 例: 如果您只有一个if else,则没有区别,因为该条件将始终被评估,并且几乎总是正确还是错误都无关紧要。但是,如果在else部分中有if(else if),最好将最可能的真实条件放在第一个if中。因此,在大多数情况下,您不需要在else中计算条件,从而提高性能。如果If中的大多数条件为真,那么执行时间将更短。因为在第一个If条件中,只有满足了它 如果If-else中的大多数条件为真,那么执行时间将少于最后一个场景,而多于第

在if、else if或else条件中放置最可能的条件是否有任何区别

例:


如果您只有一个
if else
,则没有区别,因为该条件将始终被评估,并且几乎总是正确还是错误都无关紧要。但是,如果在
else
部分中有
if
else if
),最好将最可能的真实条件放在第一个
if
中。因此,在大多数情况下,您不需要在
else
中计算条件,从而提高性能。

如果If中的大多数条件为真,那么执行时间将更短。因为在第一个If条件中,只有满足了它


如果If-else中的大多数条件为真,那么执行时间将少于最后一个场景,而多于第一个场景


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

确实如此

如果。。。否则,如果…
按编码顺序进行检查。所以,如果您将最可能的条件放在这个条件检查队列的末尾,那么这样的代码会稍微慢一点


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

最可能的情况应该是if,然后是if-else等等

最好在第一级编写最常见的条件,以便在更短的时间内首先处理该条件是否为真


如果您将最频繁的条件放在中间(else..If)或最后(else),那么到达该条件语句将需要时间,因为它需要检查每个条件语句。

这比您被告知的要多一些

  • “if”与“else”:如果一个条件及其相反项的可能性不相等,则应在“else”块中处理更可能的条件,而不是在“if”块中处理。“if”块需要一个未执行的条件跳转和围绕“else”块的最后一个分支;“else”块需要一个执行的条件分支,而根本没有最终分支

  • “if”vs“else if”vs“else”:显然,您应该处理“if”块中最常见的情况,以避免第二次测试。与第(1)条相同的考虑因素决定,最终“else-if”和最终“else”之间更常见的情况应在最终“else”块中处理

  • 话虽如此,除非测试是非琐碎的,或者所有这些块的内容都是完全琐碎的,否则它们中的任何一个都不太可能产生明显的区别

    在if、else if或else条件中,是否有任何不同之处来放置最可能的真条件

    实际上,Java的答案是“视情况而定”

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

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

    它是否真的能够进行这种优化取决于它是否能够确定重新排序是有效的。例如,它能推断出被测试的条件是相互排斥的吗


    那么这是如何影响复杂性的呢?好。。。假设JIT编译器不做任何“聪明”的事情,让我们为简化的示例求和。并且假设我们不仅仅处理长度为10的数组(这使得复杂性的讨论变得毫无意义)

    考虑这一点:

    • 对于每个零,循环执行一个测试和一个增量操作,例如2个操作

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

    当所有的零和3*N运算都是非零时,N个元素的运算量大约是2*N。但两者都是
    O(N)
    。。。因此,大O复杂性不受影响


    (好的,我遗漏了一些内容……但你明白了。其中一种情况会更快,但复杂性不会受到影响。)

    对于时间复杂性,你通常会计算最坏情况下的时间和介质。在最糟糕的时候,你显然会假设每次都会出现最复杂的路径。所以,为了回答你的问题,它不应该有什么区别。这是一个糟糕的例子,因为如果n为正(包括0),n%2将始终为0或1。感谢@Dici现在我已更正代码,我认为现在它的更正0是偶数(0%2==0)!数字只能是奇数或偶数,%2没有第三种情况。更好的例子是%3。然而,这仍然是一个糟糕的例子,因为这三种情况的概率都相同。我建议您进行编辑。@Dici-我建议您阅读JLS第15.17.3节。还有第三种情况。你的第一点引起了我的注意,但我不明白。最后一个分支叫什么?为什么它比条件跳转慢(如果我不理解的话)?@Dici条件分支加上无条件分支比条件分支慢。复杂性部分相关吗?如果他有一个从0到n-1的循环,那么他的复杂度就不一样了。然而,它与if/else if语句的顺序无关。@Dici-OP将问题标记为“时间复杂性”,因此对复杂性的讨论显然是相关的。这就是你争论的问题吗?
    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}