三項演算子の有効性についての調査
三項演算子について性能面の観点から有効性について調査してみました。
調査方法としてはMath.min(int, int)と同様の処理を行うメソッドを三項演算子を用いたものとそうでないものを作成しバイトコードの比較を行うことで確認します。
public class TestTernaryOperator { public static int min1(int a, int b) { //max_stack = 2, max_locals = 2, code_length = 11 //[1] iload_0 //[2] iload_1 //[5] if_icmpge #9 //[6] iload_0 //[9] goto #10 //[10] iload_1 //[11] ireturn return (a < b) ? a : b; } public static int min2(int a, int b) { //max_stack = 2, max_locals = 2, code_length = 9 //[1] iload_0 //[2] iload_1 //[5] if_icmpge #7 //[6] iload_0 //[7] ireturn //[8] iload_1 //[9] ireturn if (a < b) { return a; } else { return b; } } }
aの方が小さい場合に三項演算子を用いたmin1よりもifで処理しているmin2の方がgoto命令1つ分早いです。
(ifの各ブロックごとにreturnを記述しているのが効いています)
自分としては常に三項演算子のほうが高速なのではないかと予想していたのですが、必ずしもそうではないことが解りました。