以前、バード兄弟のラルエンスが「魔法の方法」を使用することは推奨されないと言っていたことを思い出しました。それ以来、魔法の方法が使用されるたびに、ブロガーは無意識のうちにそれについて考えるようになります、これは良い写真ですか?ここ 2 年間は仕事と新しい知識の学習に忙しかったため、この道について深く探求することはなく、ぼんやりしていました。今年はブロガーにとって徹底的な研究を行う年です。 、だから今私はしなければなりません この問題は解決されました。まず、Bird Brother Laruence がかつて自身のブログで述べたことを見てみましょう:
最適化の提案とは、コードを書くときに何が遅くて何が速いのかを認識できれば、不必要なコードを回避できるようにするための提案です。マジック メソッドの呼び出しは、この最適化提案によって追求される効果です
マジック メソッドのパフォーマンスは本当に悪いのでしょうか?
PHP7 でマジック メソッドを使用する際のパフォーマンスにまだ問題がありますか?
魔法の方法を合理的に使用するにはどうすればよいですか?
私の計画は次のとおりです:
マジックメソッドを使用した場合と使用しない場合のスクリプト実行時間の違いを統計的に比較
PHP5.6.26-1でスクリプトをn回連続実行
実行時間の統計 平均値/最小値/最大値
PHP7.0.12-2でスクリプトをn回連続実行
実行時間の平均/最小値/最大値を統計
現状、私の個人能力には限界があり、もっと良い解決策や提案があれば、教えてください、ありがとう、笑〜
まず、コンストラクター__constructの実験を見てみましょう。 php スクリプトは次のとおりです:
<?php/** * 魔术方法性能探索 * * 构造函数 * * @author TIGERB <https://github.com/TIGERB> */require('./function.php');if (!isset($argv[1])) { die('error: variable is_use_magic is empty'); } $is_use_magic = $argv[1];/** * 构造函数使用类名 */class ClassOne { public function classOne() { # code... } }/** * 构造函数使用魔术函数__construct */class ClassTwo { public function __construct() { # code... } } $a = getmicrotime();if ($is_use_magic === 'no_magic') { new ClassOne(); }else { new ClassTwo(); } $b = getmicrotime(); echo ($b-$a) . "\n"; PHP5.6不使用魔术方法数据如下,单位微秒μm// PHP5.6中连续调用脚本10000次sh test 10000 no_magic php5 construct// 运行数据统计脚本sh analysis ./logs/__construct_no_magic_php5.log 10000// 结果avg: 34μm max: 483μm min: 26μm
PHP5.6 では次のようにマジック メソッド データが使用されます。単位はマイクロ秒 μm です
// PHP5.6 ではスクリプトは 10,000 回連続して呼び出されます
sh test 10000 magic php5 construct// 运行数据统计脚本sh analysis ./logs/__construct_magic_php5.log 10000// 结果avg: 28μmmax: 896μmmin: 20μm
PHP7.0 ではそうではありませんマジックメソッドを使う データは以下の通り、単位はマイクロ秒μmです
// PHP7.0中连续调用脚本10000次sh test 10000 no_magic php construct// 运行数据统计脚本sh analysis ./logs/__construct_no_magic_php.log 10000// 结果avg: 19μmmax: 819μmmin: 13μm
PHP7.0ではマジックメソッドを使用します データは以下の通りです、単位はマイクロ秒μmです
// PHP7.0ではスクリプトが呼び出されます。連続 10,000 回
sh test 10000 magic php construct// 运行数据统计脚本sh analysis ./logs/__construct_magic_php.log 10000// 结果avg: 14μmmax: 157μmmin: 10μm
上記のデータから、次のことがわかります:
__construct をコンストラクターとして使用するスクリプトの平均実行時間は、クラス名をコンストラクターとして使用するよりも速く、おそらく 5 ~ 6 マイクロ秒速くなります (どちらも php5 の場合) .6とphp7.0。
次に、__call の実験を見てみましょう。PHP スクリプトは次のとおりです。
<?php/** * 魔术方法性能探索 * * 构造函数 * * @author TIGERB <https://github.com/TIGERB> */require('./function.php');if (!isset($argv[1])) { die('error: variable is_use_magic is empty'); }$is_use_magic = $argv[1];/** * 构造函数使用类名 */class ClassOne{ public function __construct() { # code... } public function test() { # code... } }/** * 构造函数使用魔术函数__construct */class ClassTwo{ public function __construct() { # code... } public function __call($method, $argus) { # code... } }$a = getmicrotime();if ($is_use_magic === 'no_magic') { $instance = new ClassOne(); $instance->test(); }else { $instance = new ClassTwo(); $instance->test(); }$b = getmicrotime();echo ($b-$a) . "\n"; PHP5.6不使用魔术方法数据如下,单位微秒μm// PHP5.6中连续调用脚本10000次sh test 10000 no_magic php5 call// 运行数据统计脚本sh analysis ./logs/__call_no_magic_php5.log 10000// 结果avg: 27μm max: 206μm min: 20μm
PHP5.6 はマジック メソッドを使用します。データは次のとおりです (マイクロ秒単位: μm)。マジックメソッドは使用しません。データの単位は次のとおりです。単位はマイクロ秒 μm
// PHP5.6中连续调用脚本10000次sh test 10000 magic php5 call// 运行数据统计脚本sh analysis ./logs/__call_magic_php5.log 10000// 结果avg: 29μmmax: 392μmmin: 22μm
PHP7.0 では、マジック メソッドのデータが次のように使用されます。単位はマイクロ秒 μm
// PHP7.0中连续调用脚本10000次sh test 10000 no_magic php call// 运行数据统计脚本sh analysis ./logs/__call_no_magic_php.log 10000// 结果avg: 16μmmax: 256μmmin: 10μm
です。上記のデータから次のことがわかります。 __call を使用したスクリプトの平均実行時間は、php5.6 と php7.0 の両方で、__call を使用しない場合よりも遅くなり、約 2 マイクロ秒遅くなります。
__callStatic
次に、__callStatic の実験を見てみましょう。 PHP スクリプトは次のとおりです。
// PHP7.0中连续调用脚本10000次sh test 10000 magic php call// 运行数据统计脚本sh analysis ./logs/__call_magic_php.log 10000// 结果avg: 18μmmax: 2459μmmin: 11μm
<?php/** * 魔术方法性能探索 * * 静态重载函数 * * @author TIGERB <https://github.com/TIGERB> */require('./function.php');if (!isset($argv[1])) { die('error: variable is_use_magic is empty'); }$is_use_magic = $argv[1];/** * 存在test静态方法 */class ClassOne{ public function __construct() { # code... } public static function test() { # code... } }/** * 使用重载实现test */class ClassTwo{ public function __construct() { # code... } public static function __callStatic($method, $argus) { # code... } }$a = getmicrotime();if ($is_use_magic === 'no_magic') { ClassOne::test(); }else { ClassTwo::test(); }$b = getmicrotime();echo ($b-$a) . "\n"; PHP5.6不使用魔术方法数据如下,单位微秒μm// PHP5.6中连续调用脚本10000次sh test 10000 no_magic php5 callStatic// 运行数据统计脚本sh analysis ./logs/__callStatic_no_magic_php5.log 10000// 结果avg: 25μm max: 129μm min: 19μm
PHP7.0 では、マジック メソッドのデータは次のように使用されます。単位はマイクロ秒 μm
です。上記のデータから次のことがわかります。 PHP5.6 で __callStatic を使用したスクリプトの平均実行時間は遅くなります。 __callStatic を使用しない場合、php7.0 では、__callStatic を使用しない場合の平均実行時間とほぼ同じになります。
__set次に、__set の実験を見てみましょう。php スクリプトは次のとおりです。// PHP5.6中连续调用脚本10000次sh test 10000 magic php5 callStatic// 运行数据统计脚本sh analysis ./logs/__callStatic_magic_php5.log 10000// 结果avg: 28μmmax: 580μmmin: 20μmPHP5.6 は次のようなマジック メソッド データを使用します。単位はマイクロ秒 μm です
// PHP7.0中连续调用脚本10000次sh test 10000 no_magic php callStatic// 运行数据统计脚本sh analysis ./logs/__callStatic_no_magic_php.log 10000// 结果avg: 14μmmax: 130μmmin: 9μm上記のデータから、次のことがわかります参照: __set を使用したスクリプトの平均実行時間は、php5.6 と php7.0 の両方で、__set を使用しない場合よりも遅くなり、約 2 マイクロ秒遅くなります。 __get 次に、__get の実験を見てみましょう。PHP スクリプトは次のとおりです。
// PHP7.0中连续调用脚本10000次sh test 10000 magic php callStatic// 运行数据统计脚本sh analysis ./logs/__callStatic_magic_php.log 10000// 结果avg: 14μmmax: 159μmmin: 10μmPHP5.6 はマジック メソッドを使用します。データは次のとおりです (マイクロ秒単位: μm)。マジックメソッドは使用しません。データの単位は次のとおりです。単位はマイクロ秒 μm
<?php /** * 魔术方法性能探索 * * 设置私有属性__set * * @author TIGERB <https://github.com/TIGERB> */require('./function.php');if (!isset($argv[1])) { die('error: variable is_use_magic is empty'); } $is_use_magic = $argv[1];/** * 实现公共方法设置私有属性 */class ClassOne { /** * 私有属性 * * @var string */ private $someVariable = 'private'; public function __construct() { # code... } public function setSomeVariable($value = '') { $this->someVariable = $value; } }/** * 使用_set设置私有属性 */class ClassTwo { /** * 私有属性 * * @var string */ private $someVariable = 'private'; public function __construct() { # code... } public function __set($name = '', $value = '') { $this->$name = $value; } } $a = getmicrotime();if ($is_use_magic === 'no_magic') { $instance = new ClassOne(); $instance->setSomeVariable('public'); }else { $instance = new ClassTwo(); $instance->someVariable = 'public'; } $b = getmicrotime(); echo ($b-$a) . "\n"; PHP5.6不使用魔术方法数据如下,单位微秒μm// PHP5.6中连续调用脚本10000次sh test 10000 no_magic php5 set// 运行数据统计脚本sh analysis ./logs/__set_no_magic_php5.log 10000// 结果avg: 31μm max: 110μm min: 24μmPHP7.0 では、マジック メソッドのデータは次のように使用されます。単位はマイクロ秒 μmです。上記のデータから次のことがわかります。 PHP5.6 での __get を使用したスクリプトの平均実行時間は、__get を使用しない場合とほぼ同じですが、php7.0 では、__get を使用したスクリプトの平均実行時間は、__get を使用しない場合よりも遅くなり、約 3 マイクロ秒遅くなります。 結論ここでは、主に __construct()、__call()、__callStatic()、__get()、__set() をテストしました。これらは、他の実装で置き換えることができる、一般的に使用される 5 つのマジック関数です。上記のテストに合格したら、質問に答えるために戻ってきます 魔法のメソッドのパフォーマンスは本当に悪いですか? 回答: __construct の使用に加えて、ここで他のマジック メソッドを使用する時間は、およそ 10 マイクロ秒以内です。 PHP7 のマジック メソッドのパフォーマンスにまだ問題がありますか? A: PHP7 でマジック メソッドを使用する場合と使用しない場合の違いは、PHP5.6 の場合とほぼ同じです。 魔法の方法を合理的に使用するにはどうすればよいですか? A: テスト全体を通して、マジック メソッドを使用しない場合の実行時間の差はおよそ 10 マイクロ秒以内であることがわかります。そのため、マジック メソッドを使用して開発コストを節約し、コードの構造を最適化できるのであれば、できるはずです。 10 マイクロ秒未満を犠牲にすることを検討してください。 __construct は高速であることを目的としているため、__construct を使用することに異論はありません。
バード兄弟のラルエンスが「魔法の方法」を使用することはお勧めできないと言っていたことを思い出しました。それ以来、魔法の方法が関係するたびに、ブロガーは無意識のうちにそれについて考えるようになります、これは良い写真ですか?ここ 2 年間は仕事と新しい知識の学習に忙しかったため、この道について深く探求することはなく、ぼんやりしていました。今年はブロガーにとって徹底的な研究を行う年です。 、だから今私はしなければなりません この問題は解決されました。まず、Bird Brother Laruence がかつて自身のブログで述べたことを見てみましょう:
最適化の提案とは、コードを書くときに何が遅くて何が速いのかを認識できれば、不必要なコードを回避できるようにするための提案です。マジックメソッドの呼び出し、これがこの最適化提案によって追求される効果です
以上がPHPパフォーマンス分析のマジックメソッド例の共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。