実際どれくらい性能が変わっているのか。
それに加えて、同じようなことができる関数でどれだけの差があるのか検証していきたいと思います。
目次
測定対象
配列のkeyが存在するのか、チェックするときなどに使われる以下の2つで測定していこうと思います。
- array_key_exists
- isset
※issetでkeyがあるか確認する場合は、keyが存在してもvalueがnullなどの場合はfalseになるの、nullが含まれる配列では使用を検討してください。
phpのバージョンは以下の3つで測っていきます。
- php5.6
- php7.2
- php7.3
測定方法
よくある実行時間を測るロジックを使います。
<?php $start = microtime(true); for ($i = 0; $i < 10000000; $i++) { // 測定用の処理 } $end = microtime(true); echo $end - $start . "秒\n";
10000000回ループを回して、array_key_exists、issetを呼び出し、その処理にかかった時間を測定しています。
実際のコード
<?php // 配列を初期化する。 $array = []; for ($i = 0; $i < 1000; $i++) { $array[] = $i; } // array_key_exists計測開始 $start = microtime(true); for ($i = 0; $i < 10000000; $i++) { if (array_key_exists(990, $array)) { $a = 1 + 1; } } $end = microtime(true); echo "-------array_key_exists-------\n"; echo $end - $start . "秒\n"; // isset 計測開始 $start = microtime(true); for ($i = 0; $i < 10000000; $i++) { if (isset($array[990])) { $a = 1 + 1; } } $end = microtime(true); echo "-------isset-------\n"; echo $end - $start . "秒\n";
測定結果
php5.6
$ php -v PHP 5.6.40 (cli) (built: Jan 23 2019 00:04:26) Copyright (c) 1997-2016 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies $ php array_key_exists_vs_isset.php -------array_key_exists------- 2.6455409526825秒 -------isset------- 1.4443778991699秒
php7.2
$ php -v PHP 7.2.14 (cli) (built: Jan 22 2019 22:25:43) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies $ php array_key_exists_vs_isset.php -------array_key_exists------- 0.26149988174438秒 -------isset------- 0.18354606628418秒
php7.3
$ php -v PHP 7.3.1 (cli) (built: Jan 22 2019 21:54:13) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.1, Copyright (c) 1998-2018 Zend Technologies $ php array_key_exists_vs_isset.php -------array_key_exists------- 0.26704597473145秒 -------isset------- 0.16867899894714秒
まとめ
流石に、issetの方が早いですね。
こうしてみるとphp5系とphp7系では、単純計算で約10倍くらいの速度差があるようです。
array_key_existsとissetは以前までは大きな差だなと思っていたんですが、
php7系からはそこまで気にするほどではないのかなと感じました。
しかし、早いには越したことはないので、issetが使えるときはissetを使っていこうかなと思っています! 時と場合によりますけどね。
今後も性能測定シリーズあげていくのでよろしくお願いします。