2016-07-11 9 views
9

PHP 7がゆっくりアンロールされ、人々はそれで作業を開始し、そのPHP7の新機能のI.関数内で型宣言を行うと、コードのパフォーマンスが向上しますか?

一つはあると思っているあなたの入力のためにすることができgive functions a type declaration、および結果のための型宣言。

例は、一つの入力は、文字列、1つのint型でなければならず、結果がブール値になります。declare(strict_types=1)なし

// PHP <7 
function foo($example, $someNumber) {} 
// PHP 7 
function foo(string $example, int $someNumber): bool{} 

は、私はあなたが間違った型を挿入すると、それが変換されることを知っています。 $exampleの番号を入力すると、文字列に変換されます。浮動小数点数を$someNumberとして追加すると、丸数字に変換されます。格闘では、タイプエラーが発生します。

可能な「ベストプラクティス」は別として、コードの型宣言を更新すると、コードのパフォーマンスが向上しますか?私は今インタプリタに何を期待しているかを伝えている可能性がありますが、余分なタイプチェックを追加する可能性もあります。
これらの機能を更新するには時間と労力が必要ですか?

+5

ヒントの大部分は、プログラマのためのヘルプ*です。適切なツール(インテリジェントIDE、静的型チェッカー)を使用すると、コードが実行される前にエラーのクラス全体を回避できます。 PHPは通常、あらかじめコンパイルされているわけではないので、静的コンパイラーほどパフォーマンスは向上しません。 – deceze

答えて

17

最終的には、型宣言を追加するときにパフォーマンスが問題になることはありません。これらは、通訳者ではなくプログラマーの人生を楽にするために存在します。彼らがあなたに役立つと思うなら、それらを使用してください。型宣言を使用するかどうかは、コードのパフォーマンスの主な決定要因になる可能性は低いです。

現在、(PHP 7.0)型宣言を使用すると、実際には小さなパフォーマンスペナルティがあります。PHPは、渡した値の型を関数でチェックする必要があるためです。チェックしないほうが速いですが、型宣言がないとどうなりますか?

しかし、これより少し微妙なもので、状況は変化しています。あなたは厳密な型指定を使用している場合

厳密な型指定力あなたが正しい種類

を渡すために、あなたが理想型(例えばint型)の値を渡す必要があり、むしろ(他のいくつかのタイプを渡すことができることよりもあなたのためにPHPを変換してください。正しい型を渡す方が、PHPを他の型から変換するよりも速くなります。型変換には時間がかかります。

型宣言は、厳密な型指定を持つかどうか、あなたは通常、同じ値の繰り返し型変換を避けるため、型変換に

あなたは型宣言を使用する場合は

を繰り返して回避することができます。

通常、いくつかの数値演算を行う関数があり、文字列引数を渡すと、PHPは演算を行うたびに適切な数値型(intまたはfloat)に変換する必要があります。

しかし、その引数に型宣言がある場合、自動的に(弱い型指定モード)または明示的に変換されたために1回のみ変換されます。

型宣言は、型チェックをElideのためにPHPを有効

型宣言は、それが時にはそれがそうでない場合は関係しているタイプのチェックを回避するために使用することができ、あなたのPHPランタイムの保証を与えます。 PHPは最初$b$cそれは実際にそれらを掛けることができる前に内部の型チェックを行う必要があり、型宣言なし

$a = $b * $c; 

;:たとえば、次のコード行を取りますPHPは両方とも数値型であることを確認し、そうでなければ変換し、適切なタイプの乗算を実行する必要があります(int x intfloatxなど)。

$b$cの型を事前に宣言しておけば、PHPはここでそれらをチェックする必要はなく、実際の乗算をすぐに行うことができます。それはより速いです。これは、関数内でこれらの変数を使用して複数の操作を行う場合に特に当てはまります。

この最適化は、OPcacheを使用する際にPHP 7.1で実装されています。

同様の最適化を実装して、引数と戻り値の型チェックも取り除くことができます。たとえば、ある関数がパラメータをintと宣言している場合、その引数をintを必要とする別の関数に渡すと、その型を再度確認する必要はありません。現在、PHP 7.1では、不要な戻り値型チェック(OPcacheを使用する場合はさらに多く)を削除できますが、引数型チェックは行われません。

これらのタイプの最適化のために、型宣言を持つコードのパフォーマンスの低下はますます小さくなっており、型宣言を持つコードは今後のコードより速くなる可能性があります。

+2

PHP 7.1ではいくつかの戻り型チェックを削除できますが、引数チェックは現在省略されていません。 – NikiC

+0

「この最適化はOPcacheを使用しているときPHP 7.1で実装されています」に関しては、そのソースがありますか、それを見つけるためにCコードを使いましたか? PHP 7.1では、OPCacheでパフォーマンス*ペナルティ*が減りましたが、タイプ宣言のないコードに比べて全体的にペナルティがあります。状況がPHP 7.2でも同じかどうか分かりますか? –

+0

@ rink.attendant.6 PHPの内部メーリングリストIIRCのDmitry Stogovによって少し書かれていますが、どのように見つけられるのか分かりません。 – Andrea

関連する問題