PHPで関数がどのように実行されているか気になるので、下記のコードをVLDで確認してみることにした。
even.php
<?php function isEven($n){ return ($n % 2 === 0); } if(isEven(2)){ echo "even"; }else{ echo "odd"; }
偶数であればtrue(真)を返す簡単な関数だ。
このコードのオペコードを確認してみると、
$ php -d vld.active=1 -d vld.execute=0 /path/to/dir/even.php Finding entry points Branch analysis from position: 0 2 jumps found. (Code = 43) Position 1 = 4, Position 2 = 6 Branch analysis from position: 4 1 jumps found. (Code = 42) Position 1 = 7 Branch analysis from position: 7 1 jumps found. (Code = 62) Position 1 = -2 Branch analysis from position: 6 1 jumps found. (Code = 62) Position 1 = -2 filename: /path/to/dir/even.php function name: (null) number of ops: 8 compiled vars: none line #* E I O op fetch ext return operands ------------------------------------------------------------------------------------- 6 0 E > INIT_FCALL 'iseven' 1 SEND_VAL 2 2 DO_FCALL 0 $0 3 > JMPZ $0, ->6 7 4 > ECHO 'even' 5 > JMP ->7 9 6 > ECHO 'odd' 11 7 > > RETURN 1 branch: # 0; line: 6- 6; sop: 0; eop: 3; out0: 4; out1: 6 branch: # 4; line: 7- 7; sop: 4; eop: 5; out0: 7 branch: # 6; line: 9- 11; sop: 6; eop: 6; out0: 7 branch: # 7; line: 11- 11; sop: 7; eop: 7; out0: -2; out1: -2 path #1: 0, 4, 7, path #2: 0, 6, 7, Function iseven: Finding entry points Branch analysis from position: 0 1 jumps found. (Code = 62) Position 1 = -2 filename: /path/to/dir/even.php function name: isEven number of ops: 5 compiled vars: !0 = $n line #* E I O op fetch ext return operands ------------------------------------------------------------------------------------- 2 0 E > RECV !0 3 1 MOD ~1 !0, 2 2 IS_IDENTICAL ~2 ~1, 0 3 > RETURN ~2 4 4* > RETURN null branch: # 0; line: 2- 4; sop: 0; eop: 4 path #1: 0, End of function iseven
オペコードが2つ生成されていた。
関数の箇所はFunction iseven:〜End of function isevenで囲まれていた。
コードの方では関数の記述は実行よりも上に記載したが、オペコードでは実行の方が上で関数が下になっている。
ここで一つ気になるのが、関数を書いた位置によってコードの実行速度が変わるか?だ。
というわけで早速試してみたいところだが、速度を計測するためのコードが思いつかないので一旦保留にする。