[PHP-users 34489] Re: PHPのバイトコード生成タイミングと実行速度

HOTTA Michihide hotta @ net-newbie.com
2009年 4月 9日 (木) 09:24:02 JST


堀田@長崎市です。

From: "SHIN SUZUKI" <shin @ powerlinker.jp>
To: <PHP-users @ php.gr.jp>
Date: Thu, 9 Apr 2009 08:43:40 +0900
Subject: [PHP-users 34488] PHPのバイトコード生成タイミングと実行速度

> そのときPHPで(コマンドで)処理するとだいたい5分ほどかかったので
> すが、この処理をPHPのようなスクリプト言語ではなくコンパイラ言語
> を用いて行った場合、 理論上は速度の改善はどれだけ認められるでし
> ょうか。
> 
> もちろん処理内容に依存するといえばそれまでなのでしょうが、

結論としては、たぶんおっしゃる通りだと思いますがw、ちょっと
ひとつ実験してみました。

m-hotta @ note:~/test$ cat a.php
<?php
printff("test\n");
m-hotta @ note:~/test$ php -l a.php
No syntax errors detected in a.php
m-hotta @ note:~/test$ php a.php
PHP Fatal error:  Call to undefined function printff() in /home/m-hotta/test/a.php on line 2

わざと関数名のつづりをミスしても、文法解析レベルではエラーを検出
しません。ということは、php は実行時に関数名(ラベル)のテーブル
を動的に生成して、関数を実行するたびに検索をやっているのではない
かという推測ができます。ソースを読んだわけではないので間違ってい
たらすみません。

一方これを C で書くと、これらはリンク時(スタティックリンク)また
は実行開始直後(ダイナミックリンク時)にアドレスに変換されてメモ
リ上に置かれるので、通常こういったことは起こりにくいと思います。

さらにクラスを使った場合は、そのコンテキストによって、ある瞬間に
参照可能なラベルも動的に変化すると思われるので、単にバイトコード
の生成コストだけでは比較できないような気もするのですが、いかがで
しょうか?オブジェクトの生成や消滅のコストも、実行回数が増えると
結構効いてくるもののようにも思えます。

> PHPのバイトコードはevalなどがコードになければ生成タイミングは一
> 度だけか

これは基本的には真だとは思いますが、eval 以外にも include() があ
りますね。これは実行時に評価されると思います。require() はパース
時のようですが。

> 重いのはスクリプトでやろうとするからだよ。Cとか使えよ

これはアルゴリズムにもよるとは思いますが、アルゴリズムが同じであ
れば、実行速度に限っては C にはかないそうもないですね。

もっとも実際の業務では、アプリケーションプログラムの実行時間の差
は、技術計算を除けば一般的には微々たるもので、この手の処理を書く
頻度とか C で書ける人材とか、開発効率(開発速度)の問題などを、
総合的に判断するべきだとは思います。

HOTTA Michihide <hotta @ net-newbie.com>


PHP-users メーリングリストの案内