php8 で使えるようになった str_contains と strpos
php8 で追加され使えるようになった str_contains。
文字列の中に指定した文字列が存在しているか確認する条件式、
if ( false !== strpos( $target, ‘search-string’ ) )
は使用頻度の高いものなので、その代替となる str_contains はかなり気になっていた関数なのであった。
strpos よりも高速に動いてくれるのであれば、喜ばしいのではあるが・・・。
str_contains は、検索文字列が存在した場合、その位置を返す strpos とは違い、存在の有無を boolean で返すだけのよりシンプルなもの。とはいっても、やっていることは同じようなことであろうから、速度的にはあまり期待はせずにいたのではある。
ベンチマークテスト
ということで、さっそくベンチをやってみた。
自分は鳥見人なので、鳥種をリストにしたファイルを持っているので、テストのサンプルにはそれを使うことにする。鳥の学名と種名がセットになったリストで、ランダムに選出した種名の基名にあたる部分を、これまたランダムに選出した行に含まれるか検索させた。ちなみに鳥データは 10518種となる。
ちゃんと検索が機能しているか確認するために、結果も返すようにしてある。
テスト環境
Windows10 Pro 64bit
Apache2.4
php8.2
ベンチ結果
▶ Firefox Developer Edition 109.0b7 (64bit)
▶ Chrome canary 111.0.5509.0(64bit)
という結果となった。
Chrome においてはわずかながら str_contains の方が速いように見えるが、Firefox においてはあまり差はないようだ。しかし、不思議に思うのは php はサーバーで動くもののはず。なにゆえにブラウザによって違いが生ずるのだろうか。しかも Firefox の場合、Windows を起動して初めてそのブラウザを起動した後の一回目のテストは極端に遅い結果となる。二度目以降が別物のごとく速く一定した数値となるのは OPcache の効果なのだろうか。これが Chrome の場合だと、初回から二回目以降と同様の高速な結果が表示されることになる。そのあたりのブラウザによる違いというのもよくわからない。
結果をみると、str_contains は strpos にくらべ、すくなくとも遅くはないようなので、ただ単に文字列の存在を確認するだけの目的であれば、strpos には返り値の 0 の問題もあるし、str_contains を使うべきということになる。
Post : 2022/12/31 12:26
Comments feed
Trackback URL : https://strix.main.jp/wp-trackback.php?p=173718