if 文と3項演算子の違い

ちょっと実例を出して比較してみようと思う。

if(hoge)var = 1;はvar = (hoge?1:var);に置き換えられる。微妙に速くなると思うけど、実際どうなのかは分からない。

坂口和彦 on Twitter: "if(hoge)var = 1;はvar = (hoge?1:var);に置き換えられる。微妙に速くなると思うけど、実際どうなのかは分からない。"

今回は JVM での例を出してますが、大抵の手続き型言語で同じようなステップ踏むから一般的な話です。
とりあえず javac して javap をば。hoge と var はフィールドとして宣言されています。

test01

if (hoge) var = 1;
  Code:
   0:   getstatic       #2; //Field hoge:Z
   3:   ifeq    10
   6:   iconst_1
   7:   putstatic       #3; //Field var:I
   10:  return

test02

var = hoge ? 1 : var;
  Code:
   0:   getstatic       #2; //Field hoge:Z
   3:   ifeq    10
   6:   iconst_1
   7:   goto    13
   10:  getstatic       #3; //Field var:I
   13:  putstatic       #3; //Field var:I
   16:  return

test03

if (hoge)
    var = 1;
else
    var = var;
  Code:
   0:   getstatic       #2; //Field hoge:Z
   3:   ifeq    13
   6:   iconst_1
   7:   putstatic       #3; //Field var:I
   10:  goto    19
   13:  getstatic       #3; //Field var:I
   16:  putstatic       #3; //Field var:I
   19:  return

まとめ

  • else を含む test02 は、else の無い test01 よりコードは長い
  • 代入が1つの test02 は、代入が2つの test02 よりコードは短い

これらがクリティカルに実行速度に関わってくることは殆どないでしょうが、比較するとステップ数が増えている分、僅かな差ですが確かに遅いです。
……java の場合、JIT 最適化でどうとでもなってしまう差だとは思いますが。