【PHP高速化】 高速に処理させる為のプチエッセンス

高速に処理させる為のプチエッセンス集です。
1回1回の処理に大差はないですが、繰り返しやアクセスが多い場合にじわじわ効きます。
(※過去記事のまとめです。バラバラで見づらかったので。)

1.インクリメントは前に「++」を付ける

$i++;
より
++$i;
の方が速い。

2.bool値の条件判定は「==true」にしない

$val がbool値を格納している場合、
if ( $val == true ) {}
より
if ( $val ) {}
の方が速い。

3.bool値の否定条件は「!」を付ける

if ( $val != true ) {}
if ( $val == false ) {}
より
 if ( !$val ) {}
の方が速い。

4.配列の文字列化はjoin()を使う

implode( ',', $arr );
より
join( ',', $arr );
の方が速い。

5.文字列はpreg_splitで分解する

explode( ',', $tmp );
split( ',', $tmp );
より
preg_split( '/,/', $tmp );
の方が速い。

6.文字列は「.」で繋ぐ

$tmp1 = "test $tmp2"
より
$tmp1 = 'test ' . $tmp2;
の方が速い。

7.forよりwhileを使う

for ( $i = 0; $i < 10000; ++$i ) {}
より
while( $i < 10000 ) {
    ++$i;
}
の方が速い。

8.配列の要素有無は(bool)か、場合によりisset()で確認する

if ( count( $tmp ) > 0 ) {}
より
if ( (bool)$tmp ) {}
の方が速い。
利用シーンが限定されるが、
if ( isset( $tmp[ 0 ] ) ) {}
はもっと速い。

9.型が分かるなら「===」で条件判定する

if ( $tmp == 1 ) {}
より
if ( $tmp === 1 ) {}
の方が速い。

10.画面表示はprintよりもechoで

print '';
より
echo '';
の方が速い。

11.無駄にdefineで定数化しない

define()で定義した定数を使うよりも、$GLOBALS[]でグローバル変数を参照する方が速い。
当然、ハードコーディングも同に定数より速い。
可読性があるので必要に応じてdefineを使うべきだが、やりすぎるのは考え物。

12.複数の文字列をechoする時は「,」で繋ぐ

echo '' . '';
より
echo '' , '';
の方が速い。

13.if ... else ... 構文では頻度が高い方をelseにする

if側よりもelse側の方が分岐が速い。
ただし、無理にelse側にすると条件判断で逆に時間がかかって逆転する可能性もあるので、無理が無い範囲で。
なお、elseifがある場合はif側が速い。

14.switch ... case ... 構文では、頻度が高いCaseを前に書く

前から順番に判断していくので、当然前の方が速い。

15.同じ値を複数の変数に格納する場合は行を分ける

$tmp1 = $tmp2 = 1;
より
$tmp1 = 1;
$tmp2 = 1;
の方が速い。

16.ループの判定条件に関数を書かない

for ( $i = 0; $i < count( $tmp ); ++$i ) {}
より
$cnt_tmp = count( $tmp );
for ( $i = 0; $i < $cnt_tmp; ++$i ) {}
の方が速い。
ループ毎に関数を実行する為で、これはかなり大幅に時間が変わります。

17.文字数字を何度も計算するならキャストしてから

文字数字を計算すると暗黙的にキャストが走る為、数値を計算するよりも遅い。
ループ等で同じ文字数字を何度も計算する場合は、事前に数値にしておくと速くなります。

18.三項演算子はifに変える

$hoge = true ? 1 : 2;
より
if ( true ) {
    $hoge = 1;
} else {
    $hoge = 2;
}
の方が速い。

19.配列の作成はループの外でやる

for ( $i = 0; $i < 10000; ++$i ) {
    if ( in_array( 1, array( 1, 2, 3, 4, 5 ) ) ) {}
}
より
$hoge = array( 1, 2, 3, 4, 5 );
for ( $i = 0; $i < 10000; ++$i ) {
    if ( in_array( 1, $hoge ) ) {}
}
の方が速い。
array(...)を実行すると、その都度配列を作る処理が走る為遅くなります。

20.一文字取るだけならsubstr()は使わない

文字列に2バイトコードが含まれていないことが前提ですが、
substr( $v, 10, 1 );
より
$v[ 10 ];
の方が速い。

21.文字列を変数に繋げる際は「.=」を使う

$hoge = $hoge . $i;
より
$hoge .= $i;
の方が速い。

22.preg_replace()よりstr_replace()の方が速い

preg_replace( '/MNOPQ/', 'QPONM', $str );
より
str_replace( 'MNOPQ', 'QPONM', $str );
の方が速い。
ただし、str_replace()で事足りる場合に限ります。

23.変数がbool型か調べる際はis_boolを使わない

if ( is_bool( $v ) ) { ... }
より
if ( $v === true || $v === false ) { ... }
の方が速い。
name
email
url
comments
   
この記事のトラックバックURL
トラックバック