将最可能的条件放入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}
答案 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)
这比你被告知要多一点。
&#39;如果&#39;与&#39;否则&#39;:如果一个条件及其相反的可能性不同,你应该处理“其他条件”中更可能的条件。阻止,而不是&#39;如果&#39;块。 &#39;如果&#39;阻止需要一个没有条件的跳跃,并且需要一个围绕“其他”的最终分支。块; &#39;其他&#39; block需要一个条件分支,而且根本没有最终分支。
&#39;如果&#39;与&#39;否则如果&#39;与&#39;其他&#39;:显然你应该处理最常见的情况,如果&#39;阻止,避免第二次测试。与(1)中相同的考虑因素确定了最终情况之间的更常见情况,否则如果&#39;而最终的其他&#39;应该在最后的“其他”中处理。块。
说了这么多,除非测试是非平凡的,或者所有这些块的内容都是微不足道的,否则任何一个块都不太可能产生明显的差异。
答案 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),那么到达那个条件语句需要时间,因为它需要检查每个条件语句。