14章性能チューニング

PHPのような動的なインタプリタ言語は、その柔軟性と使いやすさで知られていますが、その速さが評価されているわけではありません。これは、その型システムの動作に一因があります。実行時に型が推論される場合、パーサはデータが提供されるまで、ある操作をどのように実行するかを正確に知ることはできません。

以下の、2つの要素を足し合わせるPHPの弱い型付けの関数add()を考えてみましょう。

function add($a, $b)
{
    return $a + $b;
}

この関数は、指定された変数の型や戻り値の型を宣言していないので、複数のシグネチャの可能性があります。例14-1に示したシグネチャはすべて、関数add()を呼び出すのに等しく有効な方法です。

例14-1 同一の関数定義に関する複数のシグネチャ

add(int $a,    int $b):   int ❶
add(float $a,  float $b): float ❷
add(int $a,    float $b): float ❸
add(float $a,  int $b):   float ❹
add(string $a, int $b):   int ❺
add(string $a, int $b):   float ❻

add(1, 2)int(3)を返す

add(1., 2.)float(3)を返す

add(1, 2.)float(3)を返す

add(1., 2)float(3)を返す

add("1", 2)int(3)を返す

add("1.", 2)float(3)を返す

この例は、扱う関数が1種類であっても、内部的にその関数を複数の方法で処理する必要があることを示しています。PHPでは、実勢にどの方法で処理する必要があるかは、データが提供されるまでわからないため、必要に応じて内部的にある値を他の型にキャストする場合があります。しかし、実行時には、実際の関数は専用の仮想マシンを通してプロセッサ上で実行されるオペレーションコード(オペコード)にコンパイルされており、異なる入力と戻り値に対応するためにPHPは同じ関数のオペコードとして複数の方法で処理する必要があります。 ...

Get PHPクックブック ―モダンPHPによるWebアプリケーション実用レシピ集 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.