LoginSignup
1
1

More than 1 year has passed since last update.

for文の条件式に、count()等のサイズを取得するメソッドを使用すると処理速度が遅くなる

Posted at

概要

for文を書いた際、静的解析で何故か指摘されたので、PHPの公式リファレンスを見ていたら、条件式の部分にcount()メソッド等のサイズを取得するメソッドを記述しない方が良いと記載がありました。条件式の部分に、配列のサイズを取得するメソッドを使用すると毎回サイズを取得する為、速度が遅くなるみたいです。この件は初めて知る内容だったので、備忘録も兼ねて記事にまとめました。

従来の書き方

for文でループ処理を書く際、条件式の部分にcount()等のメソッド使い、配列等の最大値を取得するメソッド記述しているかと思われます。
私も、今まででしたら1行でもコードを減らして書きたい派なので、下記の記述でfor文を書いていました。
(下記に参考式)

# for文の定義
for (初期値; 条件式; 増減式)
    # 処理
}
 
# 一般的なfor文の書き方
$test = [
    0 => 'aaa',
    1 => 'bbb',
    2 => 'ccc',
];

# count()メソッドを使い配列の最大値を取得
for($i = 0; $i < count($test); ++$i) {
    # 処理
}

この書き方は、繰り返し処理が発生する度に、条件式を毎回読み込む処理が発生する為、処理速度が落ちるそうです。
上記の問題を解決する為には、下記の記述で問題は解消されます。

パターン1の書き方

$test = [
    0 => 'aaa',
    1 => 'bbb',
    2 => 'ccc',
];

$countMax = count($test)
for($i = 0; $i < $countMax; ++$i) {
    # 処理
}

パターン2の書き方

$test = [
    0 => 'aaa',
    1 => 'bbb',
    2 => 'ccc',
];

for($i = 0, $size = count($test); $i < $size; ++$i) {
    # 処理
}

公式リファレンスでは、パターン2の書き方が推奨されています。
個人的は、パターン1で書く方がfor文も見やすいので、オススメかとは思います。

感想

今回の件を知った時は、目から鱗状態でした。公式のドキュメントやリファレンスを見ると思わぬ発見があるので、今後も目を通していきたいと思います。

参考資料

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1