印刷またはエコー、どちらが速いですか?

カットの下では、Fabien Potencierのかなり古い記事の印刷版とエコーの翻訳がありますが、これは「真実」を確立する方法によって顕著です。 そのような研究の大部分とは異なり、この場合、何百万回もエコーおよび出力を行うスクリプトの実行は見つかりません。



免責事項:翻訳は、文字通りリテラルまたは文学ではありません。



印刷とエコー、どちらが速いですか?


私たちの多くがそうであるように、printをechoに置き換えたり、++ $ Iを$ i ++にしたり、二重引用符を単一引用符にしたりといった、意味のないマイクロ最適化に関するブログ記事を読むのはうんざりです。 なんで? なぜなら99.999999%のケースでは、それは問題ではないからです。 なんで? 99.99%のケースでは、オペコードタイプAPCのキャッシュをインストールするか、データベースに不足しているインデックスを追加するか、メインクエリで作成する1000個のSQLクエリを作成しないようにすると、あなたにとってより良いでしょう。



しかし、あなたが本当にこの質問に対する答えを知りたいと思っているふりをしましょう。 スクリプトを作成して何百万回も実行するのではなく、PHPコードの理解を深めるのに役立つツールを紹介します。



会う-VLD- 「Vulcan Logic Disassembler」。 VLDはDerrick Rethansによって作成され、プロジェクトのメインページを読むと明らかになるように、「VLDはZend Engineにしがみつき、実行されたスクリプトのすべてのオペコードをダンプします。」



VLDのインストールは簡単です。他のPHP拡張機能と同じようにダウンロードしてインストールしてください。



phpize $ ./configure $ sudo make install
      
      





php.iniのプラグイン拡張



 extension=vld.so
      
      





(まあ、または何らかの種類の/etc/php/apache2/conf.d/vld.iniで-OSのどこでこれを行うかをおおよそ知っています。)



ボンネットの下を見る時間です。 2つのファイルを作成します。1つはエコー付きで、もう1つは印刷付きです

 // print.php <?php print 'foo';
      
      





 // echo.php <?php echo 'foo';
      
      





パラメーター-d vld.activate = 1を指定してコマンドラインからこれらのスクリプトを実行し、VLD出力をアクティブにして、スクリプトによって発行されたオペコードを見てみましょう。

 $ php -d vld.active=1 print.php
      
      





 number of ops: 4 compiled vars: none line # op fetch ext return operands ------------------------------------------------------------------------------- 1 0 PRINT ~0 'foo' 1 FREE ~0 2 2 RETURN 1 3* ZEND_HANDLE_EXCEPTION
      
      





-
 $ php -d vld.active=1 echo.php
      
      





 number of ops: 3 compiled vars: none line # op fetch ext return operands ------------------------------------------------------------------------------- 1 0 ECHO 'foo' 2 1 RETURN 1 2* ZEND_HANDLE_EXCEPTION
      
      





違いが見つかりましたか? -はい、printは何かを返すため、もう1つのオペコードを使用します。 エコーは印刷よりも高速であると結論付けることができます。 しかし、1つのオペコードの費用はかかりません。 真実は。 スクリプト内に何百もの印刷呼び出しがある場合でも(式X = E-1約あたりを思い出してください。)



ちなみに、printは常に1を返すため、次のような興味深いことができます。

 //     echo <?php $isFoo and print 'foo'; ?>
      
      







多数のインクルージョンを使用してスクリプトを実行したときに実行されるオペコードの量を知りたいですか? これを試してください:

 $ php -d vld.active=1 print.php 2> output $ grep "number of ops" output | cut -f 5 -d ' ' | (tr '\n' +; echo 0) | bc
      
      





裸のWordpressで試しました。 スクリプトはラップトップで「バスエラー」エラーで落ちるまでハングしますが、この時点でオペコードの数は230万を超えています。 それはそれをすべて言います。



All Articles