Взяв ответы (пока) здесь:
public class X
{
static boolean a(final boolean a, final boolean b, final boolean c)
{
return ((a && b) || (b && c) || (a && c));
}
static boolean b(final boolean a, final boolean b, final boolean c)
{
return a ? (b || c) : (b && c);
}
static boolean c(final boolean a, final boolean b, final boolean c)
{
return ((a & b) | (b & c) | (c & a));
}
static boolean d(final boolean a, final boolean b, final boolean c)
{
return ((a?1:0)+(b?1:0)+(c?1:0) >= 2);
}
}
и запустив их через декомпилятор (javap -c X> results.txt):
Compiled from "X.java"
public class X extends java.lang.Object{
public X();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
static boolean a(boolean, boolean, boolean);
Code:
0: iload_0
1: ifeq 8
4: iload_1
5: ifne 24
8: iload_1
9: ifeq 16
12: iload_2
13: ifne 24
16: iload_0
17: ifeq 28
20: iload_2
21: ifeq 28
24: iconst_1
25: goto 29
28: iconst_0
29: ireturn
static boolean b(boolean, boolean, boolean);
Code:
0: iload_0
1: ifeq 20
4: iload_1
5: ifne 12
8: iload_2
9: ifeq 16
12: iconst_1
13: goto 33
16: iconst_0
17: goto 33
20: iload_1
21: ifeq 32
24: iload_2
25: ifeq 32
28: iconst_1
29: goto 33
32: iconst_0
33: ireturn
static boolean c(boolean, boolean, boolean);
Code:
0: iload_0
1: iload_1
2: iand
3: iload_1
4: iload_2
5: iand
6: ior
7: iload_2
8: iload_0
9: iand
10: ior
11: ireturn
static boolean d(boolean, boolean, boolean);
Code:
0: iload_0
1: ifeq 8
4: iconst_1
5: goto 9
8: iconst_0
9: iload_1
10: ifeq 17
13: iconst_1
14: goto 18
17: iconst_0
18: iadd
19: iload_2
20: ifeq 27
23: iconst_1
24: goto 28
27: iconst_0
28: iadd
29: iconst_2
30: if_icmplt 37
33: iconst_1
34: goto 38
37: iconst_0
38: ireturn
}
Вы можете увидетьчто?: немного лучше, чем исправленная версия вашего оригинала.Лучшим является тот, который вообще избегает ветвления.Это хорошо с точки зрения меньшего количества инструкций (в большинстве случаев) и лучше для частей ЦП с предсказанием переходов, поскольку неправильное предположение в прогнозе ветвления может привести к остановке ЦП.
Я бы сказал, что самый эффективный - тот, что из лунной тени в целом.Он использует наименьшее количество инструкций в среднем и снижает вероятность остановки конвейера в ЦП.
Чтобы быть на 100% уверенным, вам потребуется выяснить стоимость (в циклах ЦП) для каждой инструкции, которая, к сожалению, не всегда доступна (вам нужно будет найти источник горячей точки, а затемПоставщики ЦП задают время, затрачиваемое на каждую сгенерированную инструкцию).
См. Обновленный ответ Rotsor для анализа кода во время выполнения.