日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

PHP 魔法函數(shù)性能分析

瀏覽:172日期:2022-09-11 14:43:33

曾經(jīng)記得鳥哥Laruence提過不建議使用”魔術(shù)方法”,自此之后一旦涉及使用魔術(shù)方法的地方,我都會下意識的想一下,這樣寫真的好嗎?由于這一到兩年來一直忙于工作和學習新的知識,所以在這道坎兒上一直沒有做深入的探索一直恍恍惚惚過去了,今年是我進行深入學習的一年,因此現(xiàn)在必須對這個問題做個了結(jié)了。我們先來看看鳥哥Laruence博客曾經(jīng)提到的:

當我把PPT分享給公司的同事的時候, 會有人質(zhì)疑, 魔術(shù)方法都不讓用?

優(yōu)化的建議, 是建議, 是防止大家濫用, 肆無忌憚的用. 如果你能在寫代碼的時候, 能意識到, 什么慢, 什么快, 從而避免一些沒有必要的對魔術(shù)方法的調(diào)用, 那就是這個優(yōu)化建議所追求的效果了

疑惑 魔術(shù)方法真的性能比較差嗎? PHP7里使用魔術(shù)方法的性能還是存在問題嗎? 我們應(yīng)該如何合理的使用魔術(shù)方法? 方案

面對我的疑惑,我的方案是:

統(tǒng)計對比使用魔術(shù)方法和不使用魔術(shù)方法腳本執(zhí)行的時間差異 PHP5.6.26-1 下連續(xù)執(zhí)行腳本n次 統(tǒng)計執(zhí)行時間的平均值/最小值/最大值 PHP7.0.12-2 下連續(xù)執(zhí)行腳本n次 統(tǒng)計執(zhí)行時間的平均值/最小值/最大值

目前個人能力有限,只能通過這種方式,如果你有更好的方案或者建議可以告訴我,謝謝,haha~

測試 __construct

首先我們先來看看構(gòu)造函數(shù)__construct的實驗,php腳本如下:

<?php/** * 魔術(shù)方法性能探索 * * 構(gòu)造函數(shù) * * @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];/** * 構(gòu)造函數(shù)使用類名 */class ClassOne{ public function classOne() {# code... }}/** * 構(gòu)造函數(shù)使用魔術(shù)函數(shù)__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不使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP5.6中連續(xù)調(diào)用腳本10000次sh test 10000 no_magic php5 construct// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__construct_no_magic_php5.log 10000// 結(jié)果avg: 34μmmax: 483μmmin: 26μm PHP5.6使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP5.6中連續(xù)調(diào)用腳本10000次sh test 10000 magic php5 construct// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__construct_magic_php5.log 10000// 結(jié)果avg: 28μmmax: 896μmmin: 20μm PHP7.0不使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP7.0中連續(xù)調(diào)用腳本10000次sh test 10000 no_magic php construct// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__construct_no_magic_php.log 10000// 結(jié)果avg: 19μmmax: 819μmmin: 13μm PHP7.0使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP7.0中連續(xù)調(diào)用腳本10000次sh test 10000 magic php construct// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__construct_magic_php.log 10000// 結(jié)果avg: 14μmmax: 157μmmin: 10μm

通過上面的數(shù)據(jù)我們可以看出:

使用__construct作為構(gòu)造函數(shù)的腳本執(zhí)行的平均時間是要快于使用類名作為構(gòu)造函數(shù)的, 大概快5到6微秒 ,不論是在php5.6還是php7.0中。

__call

接著,我們來看看__call的實驗,php腳本如下:

<?php/** * 魔術(shù)方法性能探索 * * 構(gòu)造函數(shù) * * @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];/** * 構(gòu)造函數(shù)使用類名 */class ClassOne{ public function __construct() {# code... } public function test() {# code... }}/** * 構(gòu)造函數(shù)使用魔術(shù)函數(shù)__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不使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP5.6中連續(xù)調(diào)用腳本10000次sh test 10000 no_magic php5 call// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__call_no_magic_php5.log 10000// 結(jié)果avg: 27μmmax: 206μmmin: 20μm PHP5.6使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP5.6中連續(xù)調(diào)用腳本10000次sh test 10000 magic php5 call// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__call_magic_php5.log 10000// 結(jié)果avg: 29μmmax: 392μmmin: 22μm PHP7.0不使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP7.0中連續(xù)調(diào)用腳本10000次sh test 10000 no_magic php call// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__call_no_magic_php.log 10000// 結(jié)果avg: 16μmmax: 256μmmin: 10μm PHP7.0使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP7.0中連續(xù)調(diào)用腳本10000次sh test 10000 magic php call// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__call_magic_php.log 10000// 結(jié)果avg: 18μmmax: 2459μmmin: 11μm

通過上面的數(shù)據(jù)我們可以看出:

使用__call的腳本執(zhí)行的平均時間是要慢于不使用, 大概慢2微秒 ,不論是在php5.6還是php7.0中。

__callStatic

接著,我們來看看__callStatic的實驗,php腳本如下:

<?php/** * 魔術(shù)方法性能探索 * * 靜態(tài)重載函數(shù) * * @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靜態(tài)方法 */class ClassOne{ public function __construct() {# code... } public static function test() {# code... }}/** * 使用重載實現(xiàn)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不使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP5.6中連續(xù)調(diào)用腳本10000次sh test 10000 no_magic php5 callStatic// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__callStatic_no_magic_php5.log 10000// 結(jié)果avg: 25μmmax: 129μmmin: 19μm PHP5.6使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP5.6中連續(xù)調(diào)用腳本10000次sh test 10000 magic php5 callStatic// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__callStatic_magic_php5.log 10000// 結(jié)果avg: 28μmmax: 580μmmin: 20μm PHP7.0不使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP7.0中連續(xù)調(diào)用腳本10000次sh test 10000 no_magic php callStatic// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__callStatic_no_magic_php.log 10000// 結(jié)果avg: 14μmmax: 130μmmin: 9μm PHP7.0使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP7.0中連續(xù)調(diào)用腳本10000次sh test 10000 magic php callStatic// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__callStatic_magic_php.log 10000// 結(jié)果avg: 14μmmax: 159μmmin: 10μm

通過上面的數(shù)據(jù)我們可以看出:

在php5.6中使用__callStatic的腳本執(zhí)行的平均時間是要慢于不使用, 大概慢3微秒 ;在php7.0中使用__callStatic的腳本執(zhí)行的平均時間是要大致等于不使用__callStatic的;

__set

接著,我們來看看__set的實驗,php腳本如下:

<?php/** * 魔術(shù)方法性能探索 * * 設(shè)置私有屬性__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];/** * 實現(xiàn)公共方法設(shè)置私有屬性 */class ClassOne{ /** * 私有屬性 * * @var string */ private $someVariable = ’private’; public function __construct() {# code... } public function setSomeVariable($value = ’’) {$this->someVariable = $value; }}/** * 使用_set設(shè)置私有屬性 */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不使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP5.6中連續(xù)調(diào)用腳本10000次sh test 10000 no_magic php5 set// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__set_no_magic_php5.log 10000// 結(jié)果avg: 31μmmax: 110μmmin: 24μm PHP5.6使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP5.6中連續(xù)調(diào)用腳本10000次sh test 10000 magic php5 set// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__set_magic_php5.log 10000// 結(jié)果avg: 33μmmax: 138μmmin: 25μm PHP7.0不使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP7.0中連續(xù)調(diào)用腳本10000次sh test 10000 no_magic php set// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__set_no_magic_php.log 10000// 結(jié)果avg: 15μmmax: 441μmmin: 11μm PHP7.0使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP7.0中連續(xù)調(diào)用腳本10000次sh test 10000 magic php set// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__set_magic_php.log 10000// 結(jié)果avg: 17μmmax: 120μmmin: 11μm

通過上面的數(shù)據(jù)我們可以看出:

使用__set的腳本執(zhí)行的平均時間是要慢于不使用, 大概慢2微秒 ,不論是在php5.6還是php7.0中。

__get

接著,我們來看看__get的實驗,php腳本如下:

<?php/** * 魔術(shù)方法性能探索 * * 讀取私有屬性__get * * @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];/** * 實現(xiàn)公共方法獲取私有屬性 */class ClassOne{ /** * 私有屬性 * * @var string */ private $someVariable = ’private’; public function __construct() {# code... } public function getSomeVariable() {return $this->someVariable; }}/** * 使用_get獲取私有屬性 */class ClassTwo{ /** * 私有屬性 * * @var string */ private $someVariable = ’private’; public function __construct() {# code... } public function __get($name = ’’) {return $this->$name; }}$a = getmicrotime();if ($is_use_magic === ’no_magic’) { $instance = new ClassOne(); $instance->getSomeVariable();}else { $instance = new ClassTwo(); $instance->someVariable;}$b = getmicrotime();echo ($b-$a) . 'n'; PHP5.6不使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP5.6中連續(xù)調(diào)用腳本10000次sh test 10000 no_magic php5 get// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__get_no_magic_php5.log 10000// 結(jié)果avg: 28μmmax: 590μmmin: 20μm PHP5.6使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP5.6中連續(xù)調(diào)用腳本10000次sh test 10000 magic php5 get// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__get_magic_php5.log 10000// 結(jié)果avg: 28μmmax: 211μmmin: 22μm PHP7.0不使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP7.0中連續(xù)調(diào)用腳本10000次sh test 10000 no_magic php get// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__get_no_magic_php.log 10000// 結(jié)果avg: 16μmmax: 295μmmin: 10μm PHP7.0使用魔術(shù)方法數(shù)據(jù)如下,單位微秒μm

// PHP7.0中連續(xù)調(diào)用腳本10000次sh test 10000 magic php get// 運行數(shù)據(jù)統(tǒng)計腳本sh analysis ./logs/__get_magic_php.log 10000// 結(jié)果avg: 19μmmax: 525μmmin: 12μm

通過上面的數(shù)據(jù)我們可以看出:

在php5.6中使用__get的腳本執(zhí)行的平均時間是要大致等于不使用__get的;在php7.0中使用__get的腳本執(zhí)行的平均時間是要慢于不使用, 大概慢3微秒

結(jié)語

這里主要測試了__construct(), __call(), __callStatic(), __get(), __set()這五個常用的且可有其他實現(xiàn)方式代替的魔法函數(shù)。通過上面的測試再回來解答我的疑惑

魔術(shù)方法真的性能比較差嗎?

答:除了使用__construct之外,這里使用其他的魔法方法的時間大致慢10微妙以內(nèi)。

PHP7里使用魔術(shù)方法的性能還是存在問題嗎?

答:在PHP7中使用與不使用魔術(shù)方法之間的差異和在PHP5.6中近乎一致。

我們應(yīng)該如何合理的使用魔術(shù)方法?

答:通過整個測試我們可以看出使不使用魔法方法這之間的執(zhí)行時間差異大致都是在10微妙以內(nèi)的,所以如果魔法方法可以很好的節(jié)省我們的開發(fā)成本和優(yōu)化我們的代碼結(jié)構(gòu),我們應(yīng)該可以考慮犧牲掉這不到10微妙。而__construct是要快的,所以使用__construct應(yīng)該沒什么異議。

來自:http://tigerb.cn/2017/03/04/php-magic-function/

標簽: PHP
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品激情电影| 99精品99| 国产精品女主播一区二区三区| 国产v日韩v欧美v| 精品资源在线| 黄色网一区二区| 国产一区调教| 97精品国产| 日本欧美不卡| 欧美丝袜一区| 欧美日韩日本国产亚洲在线 | 国产综合色产| 久久亚洲专区| 欧美日韩国产探花| 国产精品美女| 日韩一区二区三免费高清在线观看 | 色综合视频一区二区三区日韩 | 国产日本久久| 国产精品115| 久久亚洲国产精品尤物| 国产探花在线精品一区二区| 国产精品啊v在线| 精品国产一区二区三区性色av| 免费亚洲婷婷| 综合日韩av| 久久精品欧美一区| 久久午夜精品| 欧美日韩18| 国产中文欧美日韩在线| 四虎4545www国产精品| 国内精品福利| 一区二区三区国产盗摄| 国产欧美三级| 深夜福利视频一区二区| 狠狠久久婷婷| 亚洲一区二区三区四区电影| 日韩国产欧美视频| 精品日产乱码久久久久久仙踪林| 91日韩在线| 亚洲一区黄色| 国产精品久久久久久久久久妞妞| 91视频久久| 国产亚洲在线| 国产精品色在线网站| 国产一二在线播放| 欧美亚洲激情| 日韩精品欧美大片| 高清在线一区| 亚洲一级在线| 麻豆精品视频在线观看视频| 都市激情国产精品| 日韩一区欧美二区| 麻豆成人综合网| 欧美日中文字幕| 日韩精品成人| 午夜精品成人av| 一区二区国产精品| 国产精品麻豆久久| 亚洲精品免费观看| 日韩电影免费网址| 日韩精品久久久久久久软件91| 国产传媒在线观看| 日韩国产精品久久久久久亚洲| 电影亚洲精品噜噜在线观看| 日韩精品视频中文字幕| 国产精品不卡| 亚洲精品三级| 91精品一区国产高清在线gif | 国产精品传媒麻豆hd| 亚洲激精日韩激精欧美精品| 久久超级碰碰| 亚洲欧美日韩一区在线观看| 精品久久福利| 91午夜精品| 国产视频一区在线观看一区免费| 国产一区二区精品久| 亚洲啊v在线免费视频| 日韩精品dvd| 日韩av网站在线观看| 在线精品视频在线观看高清| 国产精品亚洲成在人线| 国产精品毛片| 久久久天天操| 精品一区二区三区在线观看视频 | 99热精品在线| 日韩中文在线电影| 久久精品国产免费| 欧美私人啪啪vps| 亚洲主播在线| 亚洲一本视频| 日韩精品2区| 精品一区二区三区视频在线播放 | 久久精品二区三区| 国产一区二区精品久| 国产精品久久久久久模特| 亚洲精品一级二级三级| 国产精品婷婷| 午夜免费一区| 性感美女一区二区在线观看| 美女视频网站久久| 国产激情久久| 国产精品日本一区二区三区在线| 亚洲三级观看| 亚洲综合另类| 久久精品免费一区二区三区| 97视频热人人精品免费| 久久久久观看| 国产香蕉精品| 国产精选久久| 欧美亚洲综合视频| 日韩国产在线观看| 日韩欧美美女在线观看| 一区二区精彩视频| 午夜精品影视国产一区在线麻豆| 亚洲一区二区三区久久久| 99国产精品自拍| 亚洲综合精品| 亚洲一区二区免费在线观看| 亚洲一区二区三区久久久| 99视频精品| 先锋影音国产一区| 综合色就爱涩涩涩综合婷婷| 日av在线不卡| 在线亚洲欧美| 久久福利精品| 亚洲区第一页| 91精品尤物| 国产麻豆一区二区三区精品视频| 97精品资源在线观看| 欧美在线首页| 久久a爱视频| 精品久久久中文字幕| 成人一区而且| 久久精品主播| 婷婷亚洲综合| 男女性色大片免费观看一区二区| 免费看黄色91| 一区二区不卡| 欧美日韩精品一区二区三区视频 | 亚洲一级在线| 在线精品亚洲| 欧美一区二区三区免费看| 91精品国产自产观看在线| 69堂免费精品视频在线播放| 国产精品综合| 成人欧美一区二区三区的电影| 日本欧美不卡| 天堂va蜜桃一区二区三区| 日韩视频一二区| 久久精品国产网站| 久久人人97超碰国产公开结果| 亚洲成人一区| 中文字幕日本一区| 国产精品调教| 亚洲精品在线影院| 蜜桃视频第一区免费观看| 日韩av一级片| 精品国产欧美日韩一区二区三区| 久久国产影院| 亚洲毛片在线| 国精品产品一区| 欧美特黄一级| 国产一卡不卡| 国产亚洲一区二区手机在线观看 | 久久中文字幕二区| 免费人成黄页网站在线一区二区| 欧美一区网站| 成人自拍av| 亚洲精品美女91| 国产精品久久久久久模特| 少妇久久久久| 午夜精品影视国产一区在线麻豆| 免费在线欧美黄色| 国产综合精品| 国产精品一线| 美女少妇全过程你懂的久久| 日韩在线电影| 成人日韩精品| 四虎在线精品| 捆绑调教日本一区二区三区| 国产精品美女久久久| 欧美成人一二区| 国产视频一区三区| 久久精品二区亚洲w码| 午夜欧美在线| 欧美1区2区3| 蜜桃av一区二区在线观看| 日韩成人a**站| 亚洲综合图色| 久久91导航| 国产亚洲高清一区| 国产高清久久| 精品一区二区三区中文字幕 | 日本一区二区免费高清| 蜜臀久久99精品久久久久宅男| 精品视频国产| 快she精品国产999| 国模大尺度视频一区二区| 中文字幕日韩亚洲| 亚洲成人精品|