以前、if文、参考演算子、switch文、match式についてのベンチマークをしましたが、今回はif文の書き方に特化したベンチマークテストを実施してみます。
if文の書き方3種類と、else + 入れ子、elseif、else ifの違いについてなど、複数のテストケースでベンチマークテストを実施してみます。
結論
if文の書き方の違いについて、パフォーマンスにおいてなんの成果も!!得られませんでした!!顕著な差は見られませんでした。
というわけで、あとは好みの問題になってくるわけです。
コード量を減らすために波括弧なしを採用するコーディング規約を見かけますが、
筆者個人的にはPSR-12でも採用している波括弧推しです。
見やすさ重視でいきましょうよ。
コロン + endif は使いたくないです。
あと、個人的にはelseifとelse ifはどちらでも構わないですが、
どちらか一方に統一して欲しいです。片方廃止してください。
if文のおさらい
▼if文の公式ドキュメント

▼if文の構造的な書き方は次の3通り。
- 波括弧なし
// 1行で書く例
if ($a < $b) $a++;
// 2行で書く例
if ($a < $b)
$a++;
// これはNG
if ($a < $b)
$a++;
$b++; // これはif文の外側の扱い
筆者はこの記述は嫌いなので使いません。コーディング規約にある場合だけ使います。
- 波括弧で括る
// 1行で書く例
if ($a < $b) { $a++; }
// 複数行で書く例
if ($a < $b) {
$a++;
}
この(波括弧で括り複数行で書く)書き方が主流ですよね。
- コロン + endif;
// 1行で書く例
if ($a < $b): $a++; endif;
// 複数行で書く例
if ($a < $b):
$a++;
endif;
筆者はこの書き方も嫌いなので使いません。コーディング規約でも見たことありません。
▼else
- 波括弧なし
if ($a < $b)
echo "aの方がちいさい" . PHP_EOL;
else
echo "aの方がでかい" . PHP_EOL;
- 波括弧で括る
if ($a < $b) {
echo "aの方がちいさい" . PHP_EOL;
} else {
echo "aの方がでかい" . PHP_EOL;
}
- コロン + endif;
if ($a < $b):
echo "aの方がちいさい" . PHP_EOL;
else:
echo "aの方がでかい" . PHP_EOL;
endif;
▼elseif
- 波括弧なし
if ($a < $b)
echo "aの方がちいさい" . PHP_EOL;
elseif ($a === $b)
echo "aとbはおなじ" . PHP_EOL;
else
echo "aの方がでかい" . PHP_EOL;
- 波括弧で括る
if ($a < $b) {
echo "aの方がちいさい" . PHP_EOL;
} elseif ($a === $b) {
echo "aとbはおなじ" . PHP_EOL;
} else {
echo "aの方がでかい" . PHP_EOL;
}
- コロン + endif;
if ($a < $b):
echo "aの方がちいさい" . PHP_EOL;
elseif ($a === $b):
echo "aとbはおなじ" . PHP_EOL;
else:
echo "aの方がでかい" . PHP_EOL;
endif;
▼else if
- 波括弧なし
if ($a < $b)
echo "aの方がちいさい" . PHP_EOL;
else if ($a === $b)
echo "aとbはおなじ" . PHP_EOL;
else
echo "aの方がでかい" . PHP_EOL;
- 波括弧で括る
if ($a < $b) {
echo "aの方がちいさい" . PHP_EOL;
} else if ($a === $b) {
echo "aとbはおなじ" . PHP_EOL;
} else {
echo "aの方がでかい" . PHP_EOL;
}
- コロン + endif; ・・・これは許容されていません ⇒ syntax error になります
if ($a < $b):
echo "aの方がちいさい" . PHP_EOL;
else if ($a === $b): // syntax error
echo "aとbはおなじ" . PHP_EOL;
else:
echo "aの方がでかい" . PHP_EOL;
endif;
▼入れ子
- 波括弧なし
if ($a)
if ($b)
echo "a: true, b: true" . PHP_EOL;
else
echo "a: true, b: false" . PHP_EOL;
else
if ($b)
echo "a: false, b: true" . PHP_EOL;
else
echo "a: false, b: false" . PHP_EOL;
- 波括弧で括る
if ($a) {
if ($b) {
echo "a: true, b: true" . PHP_EOL;
} else {
echo "a: true, b: false" . PHP_EOL;
}
} else {
if ($b) {
echo "a: false, b: true" . PHP_EOL;
} else {
echo "a: false, b: false" . PHP_EOL;
}
}
- コロン + endif;
if ($a):
if ($b):
echo "a: true, b: true" . PHP_EOL;
else:
echo "a: true, b: false" . PHP_EOL;
endif;
else:
if ($b):
echo "a: false, b: true" . PHP_EOL;
else:
echo "a: false, b: false" . PHP_EOL;
endif;
endif;
ベンチマークテストの実施にあたり
▼使用したツール: macocci7/php-benchmark:^v0.4.2
▼実行環境:
- PHP Version: 8.2.29 / 8.3.26 / 8.4.14
- OS: Ubuntu24.04.3 LTS on WSL2 (Windows11 OSビルド:26100.7019)
- Machine: AMD Ryzen 7 7730U(2.00GHz) / RAM 16GB / 64bit
▼PHPバージョンの切り替え:phpenv
テストケース1:if文の書き方3種(elseなし)
▼テストケース
else/elseif/else ifのない単純なif文について、
[波括弧なし, 波括弧あり, コロン+endif] × [改行なし, 改行あり]
の各パターンについて、イテレーション1000000(ひゃくまん回)で時間計測します。
▼テストコード
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpBenchmark\Benchmark;
Benchmark::analyze(
[
"波括弧なし・改行なし" => function () {
$a = 0;
if (1 < 2) $a++;
},
"波括弧なし・改行あり" => function () {
$a = 0;
if (1 < 2)
$a++;
},
"波括弧あり・改行なし" => function () {
$a = 0;
if (1 < 2) { $a++; }
},
"波括弧あり・改行あり" => function () {
$a = 0;
if (1 < 2) {
$a++;
}
},
"コロン + endif・改行なし" => function () {
$a = 0;
if (1 < 2): $a++; endif;
},
"コロン + endif・改行あり" => function () {
$a = 0;
if (1 < 2):
$a++;
endif;
},
], 1000000
);
▼実行結果
$ for v in 8.2 8.3 8.4; do echo -n "PHP "; phpenv local $v; php src/testcase001.php; done
PHP 8.2
Analyzed Results:
- Fastest: 波括弧なし・改行なし (0.349256 sec)
- Slowest: 波括弧なし・改行あり (0.361577 sec)
- Details:
No. Name R2F R2S Time Average
-+--------------------------+----------+---------+-------------+-----------------
1: 波括弧なし・改行なし => 1.00 0.97 0.349256 sec 0.0000003493 sec
2: 波括弧なし・改行あり => 1.04 1.00 0.361577 sec 0.0000003616 sec
3: 波括弧あり・改行なし => 1.02 0.99 0.356164 sec 0.0000003562 sec
4: 波括弧あり・改行あり => 1.01 0.97 0.351047 sec 0.0000003510 sec
5: コロン + endif・改行なし => 1.00 0.97 0.350031 sec 0.0000003500 sec
6: コロン + endif・改行あり => 1.00 0.97 0.350184 sec 0.0000003502 sec
PHP 8.3
Analyzed Results:
- Fastest: 波括弧なし・改行なし (0.353419 sec)
- Slowest: 波括弧あり・改行あり (0.356739 sec)
- Details:
No. Name R2F R2S Time Average
-+--------------------------+----------+---------+-------------+-----------------
1: 波括弧なし・改行なし => 1.00 0.99 0.353419 sec 0.0000003534 sec
2: 波括弧なし・改行あり => 1.01 1.00 0.355941 sec 0.0000003559 sec
3: 波括弧あり・改行なし => 1.01 1.00 0.356397 sec 0.0000003564 sec
4: 波括弧あり・改行あり => 1.01 1.00 0.356739 sec 0.0000003567 sec
5: コロン + endif・改行なし => 1.00 1.00 0.354962 sec 0.0000003550 sec
6: コロン + endif・改行あり => 1.01 1.00 0.355561 sec 0.0000003556 sec
PHP 8.4
Analyzed Results:
- Fastest: コロン + endif・改行あり (0.351395 sec)
- Slowest: 波括弧なし・改行あり (0.354957 sec)
- Details:
No. Name R2F R2S Time Average
-+--------------------------+----------+---------+-------------+-----------------
1: 波括弧なし・改行なし => 1.01 1.00 0.353782 sec 0.0000003538 sec
2: 波括弧なし・改行あり => 1.01 1.00 0.354957 sec 0.0000003550 sec
3: 波括弧あり・改行なし => 1.00 0.99 0.352540 sec 0.0000003525 sec
4: 波括弧あり・改行あり => 1.00 0.99 0.352970 sec 0.0000003530 sec
5: コロン + endif・改行なし => 1.00 0.99 0.353032 sec 0.0000003530 sec
6: コロン + endif・改行あり => 1.00 0.99 0.351395 sec 0.0000003514 sec
※R2F:最速タイムに対する比率
※R2S:最遅タイムに対する比率
▼評価
実行時のPC上の実行タスクの状況により多少変わりますが、
5回実施しても書き方違いのによるタイムの差は殆どありませんでした。
比率で見ても、その差は0.05未満、誤差の範囲です。
したがって、書き方の違いによるパフォーマンスの違いは無いと言って良いでしょう。
しかし、波括弧以外は使いたくない。。
テストケース2:if文の書き方3種(elseあり)
▼テストケース
else側にマッチするケースについて、
[波括弧なし, 波括弧あり, コロン+endif]
の各パターンについて、イテレーション1000000(ひゃくまん回)で時間計測します。
▼テストコード
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpBenchmark\Benchmark;
Benchmark::analyze(
[
"波括弧なし" => function () {
$a = 0;
if (1 > 2)
$a++;
else
$a--;
},
"波括弧あり" => function () {
$a = 0;
if (1 > 2) {
$a++;
} else {
$a--;
}
},
"コロン + endif・改行あり" => function () {
$a = 0;
if (1 > 2):
$a++;
else:
$a--;
endif;
},
], 1000000
);
▼実行結果
$ for v in 8.2 8.3 8.4; do echo -n "PHP "; phpenv local $v; php src/testcase002.php; done
PHP 8.2
Analyzed Results:
- Fastest: コロン + endif・改行あり (0.350811 sec)
- Slowest: 波括弧あり (0.353853 sec)
- Details:
No. Name R2F R2S Time Average
-+--------------------------+----------+---------+-------------+-----------------
1: 波括弧なし => 1.00 0.99 0.351000 sec 0.0000003510 sec
2: 波括弧あり => 1.01 1.00 0.353853 sec 0.0000003539 sec
3: コロン + endif・改行あり => 1.00 0.99 0.350811 sec 0.0000003508 sec
PHP 8.3
Analyzed Results:
- Fastest: 波括弧なし (0.346802 sec)
- Slowest: コロン + endif・改行あり (0.347230 sec)
- Details:
No. Name R2F R2S Time Average
-+--------------------------+----------+---------+-------------+-----------------
1: 波括弧なし => 1.00 1.00 0.346802 sec 0.0000003468 sec
2: 波括弧あり => 1.00 1.00 0.346829 sec 0.0000003468 sec
3: コロン + endif・改行あり => 1.00 1.00 0.347230 sec 0.0000003472 sec
PHP 8.4
Analyzed Results:
- Fastest: 波括弧あり (0.334464 sec)
- Slowest: 波括弧なし (0.338212 sec)
- Details:
No. Name R2F R2S Time Average
-+--------------------------+----------+---------+-------------+-----------------
1: 波括弧なし => 1.01 1.00 0.338212 sec 0.0000003382 sec
2: 波括弧あり => 1.00 0.99 0.334464 sec 0.0000003345 sec
3: コロン + endif・改行あり => 1.01 0.99 0.336296 sec 0.0000003363 sec
▼評価
これも違いはありませんね。
しかし、波括弧以外は使いたくない。。
テストケース3:if文の書き方3種(elseif)
▼テストケース
elseif でマッチするケースについて、
[波括弧なし, 波括弧あり, コロン+endif]
の各パターンについて、イテレーション1000000(ひゃくまん回)で時間計測します。
▼テストコード
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpBenchmark\Benchmark;
Benchmark::analyze(
[
"波括弧なし" => function () {
$a = 0;
if (1 > 2)
$a++;
elseif (1 < 2)
$a--;
},
"波括弧あり" => function () {
$a = 0;
if (1 > 2) {
$a++;
} elseif (1 < 2) {
$a--;
}
},
"コロン + endif・改行あり" => function () {
$a = 0;
if (1 > 2):
$a++;
elseif (1 < 2):
$a--;
endif;
},
], 1000000
);
▼実行結果
for v in 8.2 8.3 8.4; do echo -n "PHP "; phpenv local $v; php src/testcase003.php; done
PHP 8.2
Analyzed Results:
- Fastest: 波括弧あり (0.390031 sec)
- Slowest: 波括弧なし (0.390816 sec)
- Details:
No. Name R2F R2S Time Average
-+--------------------------+----------+---------+-------------+-----------------
1: 波括弧なし => 1.00 1.00 0.390816 sec 0.0000003908 sec
2: 波括弧あり => 1.00 1.00 0.390031 sec 0.0000003900 sec
3: コロン + endif・改行あり => 1.00 1.00 0.390157 sec 0.0000003902 sec
PHP 8.3
Analyzed Results:
- Fastest: コロン + endif・改行あり (0.366984 sec)
- Slowest: 波括弧なし (0.372325 sec)
- Details:
No. Name R2F R2S Time Average
-+--------------------------+----------+---------+-------------+-----------------
1: 波括弧なし => 1.01 1.00 0.372325 sec 0.0000003723 sec
2: 波括弧あり => 1.00 0.99 0.368657 sec 0.0000003687 sec
3: コロン + endif・改行あり => 1.00 0.99 0.366984 sec 0.0000003670 sec
PHP 8.4
Analyzed Results:
- Fastest: 波括弧あり (0.380371 sec)
- Slowest: コロン + endif・改行あり (0.382901 sec)
- Details:
No. Name R2F R2S Time Average
-+--------------------------+----------+---------+-------------+-----------------
1: 波括弧なし => 1.00 1.00 0.382142 sec 0.0000003821 sec
2: 波括弧あり => 1.00 0.99 0.380371 sec 0.0000003804 sec
3: コロン + endif・改行あり => 1.01 1.00 0.382901 sec 0.0000003829 sec
▼評価
これも違いはありませんね。
しかし、波括弧以外は使いたくない。。
テストケース4:if文の書き方3種(入れ子)
▼テストケース
入れ子のケースについて、
[波括弧なし, 波括弧あり, コロン+endif]
の各パターンについて、イテレーション1000000(ひゃくまん回)で時間計測します。
▼テストコード
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpBenchmark\Benchmark;
Benchmark::analyze(
[
"波括弧なし" => function () {
$a = false;
$b = true;
$c = 0;
if ($a)
if ($b)
$c++;
},
"波括弧あり" => function () {
$a = false;
$b = true;
$c = 0;
if ($a) {
if ($b) {
$c++;
}
}
},
"コロン + endif・改行あり" => function () {
$a = false;
$b = true;
$c = 0;
if ($a):
if ($b):
$c++;
endif;
endif;
},
], 1000000
);
▼実行結果
$ for v in 8.2 8.3 8.4; do echo -n "PHP "; phpenv local $v; php src/testcase004.php; done
PHP 8.2
Analyzed Results:
- Fastest: コロン + endif・改行あり (0.390576 sec)
- Slowest: 波括弧なし (0.392538 sec)
- Details:
No. Name R2F R2S Time Average
-+--------------------------+----------+---------+-------------+-----------------
1: 波括弧なし => 1.01 1.00 0.392538 sec 0.0000003925 sec
2: 波括弧あり => 1.00 1.00 0.391153 sec 0.0000003912 sec
3: コロン + endif・改行あり => 1.00 1.00 0.390576 sec 0.0000003906 sec
PHP 8.3
Analyzed Results:
- Fastest: 波括弧あり (0.370207 sec)
- Slowest: 波括弧なし (0.372582 sec)
- Details:
No. Name R2F R2S Time Average
-+--------------------------+----------+---------+-------------+-----------------
1: 波括弧なし => 1.01 1.00 0.372582 sec 0.0000003726 sec
2: 波括弧あり => 1.00 0.99 0.370207 sec 0.0000003702 sec
3: コロン + endif・改行あり => 1.00 1.00 0.372011 sec 0.0000003720 sec
PHP 8.4
Analyzed Results:
- Fastest: コロン + endif・改行あり (0.368712 sec)
- Slowest: 波括弧なし (0.372653 sec)
- Details:
No. Name R2F R2S Time Average
-+--------------------------+----------+---------+-------------+-----------------
1: 波括弧なし => 1.01 1.00 0.372653 sec 0.0000003727 sec
2: 波括弧あり => 1.00 0.99 0.369243 sec 0.0000003692 sec
3: コロン + endif・改行あり => 1.00 0.99 0.368712 sec 0.0000003687 sec
▼評価
これも違いはないですね。
しかし、波括弧以外は使いたくない。。
テストケース5:if文の書き方3種(入れ子、else側)
▼テストケース
入れ子のelse側でマッチするケースについて、
[波括弧なし, 波括弧あり, コロン+endif]
の各パターンについて、イテレーション1000000(ひゃくまん回)で時間計測します。
▼テストコード
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpBenchmark\Benchmark;
Benchmark::analyze(
[
"波括弧なし" => function () {
$a = false;
$b = false;
$c = 0;
if ($a)
if ($b)
$c++;
else
$c--;
},
"波括弧あり" => function () {
$a = false;
$b = false;
$c = 0;
if ($a) {
if ($b) {
$c++;
} else {
$c--;
}
}
},
"コロン + endif" => function () {
$a = false;
$b = false;
$c = 0;
if ($a):
if ($b):
$c++;
else:
$c--;
endif;
endif;
},
], 1000000
);
▼実行結果
$ for v in 8.2 8.3 8.4; do echo -n "PHP "; phpenv local $v; php src/testcase005.php; done
PHP 8.2
Analyzed Results:
- Fastest: 波括弧あり (0.392180 sec)
- Slowest: 波括弧なし (0.399191 sec)
- Details:
No. Name R2F R2S Time Average
-+----------------+----------+---------+-------------+-----------------
1: 波括弧なし => 1.02 1.00 0.399191 sec 0.0000003992 sec
2: 波括弧あり => 1.00 0.98 0.392180 sec 0.0000003922 sec
3: コロン + endif => 1.01 0.99 0.394460 sec 0.0000003945 sec
PHP 8.3
Analyzed Results:
- Fastest: コロン + endif (0.381238 sec)
- Slowest: 波括弧なし (0.384177 sec)
- Details:
No. Name R2F R2S Time Average
-+----------------+----------+---------+-------------+-----------------
1: 波括弧なし => 1.01 1.00 0.384177 sec 0.0000003842 sec
2: 波括弧あり => 1.00 0.99 0.381945 sec 0.0000003819 sec
3: コロン + endif => 1.00 0.99 0.381238 sec 0.0000003812 sec
PHP 8.4
Analyzed Results:
- Fastest: 波括弧なし (0.375526 sec)
- Slowest: コロン + endif (0.378879 sec)
- Details:
No. Name R2F R2S Time Average
-+----------------+----------+---------+-------------+-----------------
1: 波括弧なし => 1.00 0.99 0.375526 sec 0.0000003755 sec
2: 波括弧あり => 1.00 1.00 0.377006 sec 0.0000003770 sec
3: コロン + endif => 1.01 1.00 0.378879 sec 0.0000003789 sec
▼評価
これも違いはないですね。
しかし、波括弧以外は使いたくない。。
テストケース6:elseifとelse if
▼テストケース
elseifとelse ifでマッチするケースについて、
[波括弧なし, 波括弧あり]
の各パターンについて、イテレーション1000000(ひゃくまん回)で時間計測します。
※コロン + endif は else if が使えないため除外
▼テストコード
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpBenchmark\Benchmark;
Benchmark::analyze(
[
"波括弧なしelseif" => function () {
$a = 0;
if (1 > 2)
$a++;
elseif (1 < 2)
$a--;
},
"波括弧なしelse if" => function () {
$a = 0;
if (1 > 2)
$a++;
else if (1 < 2)
$a--;
},
"波括弧ありelseif" => function () {
$a = 0;
if (1 > 2) {
$a++;
} elseif (1 < 2) {
$a--;
}
},
"波括弧ありelse if" => function () {
$a = 0;
if (1 > 2) {
$a++;
} else if (1 < 2) {
$a--;
}
},
], 1000000
);
▼実行結果
$ for v in 8.2 8.3 8.4; do echo -n "PHP "; phpenv local $v; php src/testcase006.php; done
PHP 8.2
Analyzed Results:
- Fastest: 波括弧ありelse if (0.377683 sec)
- Slowest: 波括弧なしelseif (0.385628 sec)
- Details:
No. Name R2F R2S Time Average
-+-------------------+----------+---------+-------------+-----------------
1: 波括弧なしelseif => 1.02 1.00 0.385628 sec 0.0000003856 sec
2: 波括弧なしelse if => 1.00 0.98 0.379191 sec 0.0000003792 sec
3: 波括弧ありelseif => 1.01 0.99 0.382106 sec 0.0000003821 sec
4: 波括弧ありelse if => 1.00 0.98 0.377683 sec 0.0000003777 sec
PHP 8.3
Analyzed Results:
- Fastest: 波括弧なしelse if (0.372434 sec)
- Slowest: 波括弧なしelseif (0.375518 sec)
- Details:
No. Name R2F R2S Time Average
-+-------------------+----------+---------+-------------+-----------------
1: 波括弧なしelseif => 1.01 1.00 0.375518 sec 0.0000003755 sec
2: 波括弧なしelse if => 1.00 0.99 0.372434 sec 0.0000003724 sec
3: 波括弧ありelseif => 1.01 1.00 0.374911 sec 0.0000003749 sec
4: 波括弧ありelse if => 1.01 1.00 0.375318 sec 0.0000003753 sec
PHP 8.4
Analyzed Results:
- Fastest: 波括弧なしelse if (0.375207 sec)
- Slowest: 波括弧ありelseif (0.380549 sec)
- Details:
No. Name R2F R2S Time Average
-+-------------------+----------+---------+-------------+-----------------
1: 波括弧なしelseif => 1.00 0.99 0.375549 sec 0.0000003755 sec
2: 波括弧なしelse if => 1.00 0.99 0.375207 sec 0.0000003752 sec
3: 波括弧ありelseif => 1.01 1.00 0.380549 sec 0.0000003805 sec
4: 波括弧ありelse if => 1.01 0.99 0.377705 sec 0.0000003777 sec
▼評価
これも違いはありませんね。
- 0
- 0
- 0
- 0



コメント