成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

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

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

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

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

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

面對(duì)我的疑惑,我的方案是:

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

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

測(cè)試 __construct

首先我們先來(lái)看看構(gòu)造函數(shù)__construct的實(shí)驗(yàn),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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本sh analysis ./logs/__construct_magic_php.log 10000// 結(jié)果avg: 14μmmax: 157μmmin: 10μm

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

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

__call

接著,我們來(lái)看看__call的實(shí)驗(yàn),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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本sh analysis ./logs/__call_magic_php.log 10000// 結(jié)果avg: 18μmmax: 2459μmmin: 11μm

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

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

__callStatic

接著,我們來(lái)看看__callStatic的實(shí)驗(yàn),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... }}/** * 使用重載實(shí)現(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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本sh analysis ./logs/__callStatic_magic_php.log 10000// 結(jié)果avg: 14μmmax: 159μmmin: 10μm

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

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

__set

接著,我們來(lái)看看__set的實(shí)驗(yàn),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];/** * 實(shí)現(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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本sh analysis ./logs/__set_magic_php.log 10000// 結(jié)果avg: 17μmmax: 120μmmin: 11μm

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

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

__get

接著,我們來(lái)看看__get的實(shí)驗(yàn),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];/** * 實(shí)現(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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本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// 運(yùn)行數(shù)據(jù)統(tǒng)計(jì)腳本sh analysis ./logs/__get_magic_php.log 10000// 結(jié)果avg: 19μmmax: 525μmmin: 12μm

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

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

結(jié)語(yǔ)

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

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

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

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

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

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

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

來(lái)自:http://tigerb.cn/2017/03/04/php-magic-function/

標(biāo)簽: PHP
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
91久久精品一区二区三区| 精品电影一区二区三区| 国产日产精品一区二区三区四区的观看方式| 日韩一区二区电影| 日韩中文字幕一区二区三区| 99视频在线精品国自产拍免费观看| 午夜亚洲伦理| 国产精品成人免费| 波波电影院一区二区三区| 欧美一级二级三级蜜桃| 精品一区二区在线观看| 色视频一区二区| 日本欧美一区二区三区| 久久福利毛片| 午夜欧美大尺度福利影院在线看 | 在线亚洲观看| 亚洲激情自拍偷拍| 91久久午夜| 亚洲免费观看高清| 国内揄拍国内精品久久| 中文字幕成人网| 韩国一区二区三区在线观看| 国产亚洲精品中文字幕| 成人18视频在线播放| 日韩精品一区二区三区swag| 国产高清在线精品| 欧美电影在线免费观看| 国产乱人伦精品一区二区在线观看 | 国产精品私人自拍| 欧美一区视频| 国产亚洲欧洲997久久综合 | 99麻豆久久久国产精品免费| 精品久久五月天| 91蜜桃视频在线| 国产农村妇女毛片精品久久麻豆| 国产精品v欧美精品v日韩精品| 中文字幕亚洲区| 9色精品在线| 亚洲国产精品久久久久婷婷884| 久久久久se| 久色婷婷小香蕉久久| 制服.丝袜.亚洲.中文.综合| av在线不卡观看免费观看| 国产亲近乱来精品视频| 精品福利av| 亚洲va欧美va天堂v国产综合| 美女尤物久久精品| 麻豆一区二区99久久久久| 欧美在线观看一区| 国产在线不卡视频| 欧美一区二区三区四区五区| 国产精品91一区二区| 精品国产1区2区3区| 欧美日本韩国一区二区三区| 一区二区三区av电影| 久久精品一二三区| 国产精品一品视频| 日本一区二区三区久久久久久久久不| 亚洲欧洲综合| 亚洲一区二区五区| 欧美午夜精品久久久| 国产aⅴ综合色| 国产精品美女一区二区三区| 国产精品永久入口久久久| 男女性色大片免费观看一区二区| 欧美一区二区三区白人| 91香蕉视频黄| 亚洲综合色视频| 欧美日韩一区不卡| 欧美激情第10页| 午夜激情一区二区三区| 欧美一区二区在线观看| 国产精品二区在线观看| 日韩成人免费在线| 欧美一级免费观看| 欧美精品啪啪| 日韩高清在线一区| 精品国产伦一区二区三区观看体验| 韩国在线一区| 裸体一区二区三区| 久久久综合视频| 亚洲综合丁香| 不卡一区二区中文字幕| 依依成人综合视频| 欧美一区二区三区在线视频| 亚洲天堂黄色| 在线免费观看成人短视频| 91免费国产在线| 亚洲电影激情视频网站| 在线播放一区二区三区| 最新亚洲一区| 国产 欧美在线| 亚洲一二三专区| 精品少妇一区二区三区在线视频| 亚洲影视在线| 一区二区三区国产盗摄 | 欧美国产97人人爽人人喊| 久久综合中文| 99视频精品免费视频| 欧美精品一区二区在线播放| 午夜一区不卡| 国产成人精品综合在线观看| 综合自拍亚洲综合图不卡区| 91精品国产一区二区三区蜜臀 | 久久久一区二区| 久久精品官网| 国产精品99免费看| 国产精品自产自拍| 一区二区三区在线免费观看| 精品久久久久99| 在线观看一区日韩| 一区在线视频观看| 国产一区激情在线| 亚洲乱码国产乱码精品精98午夜| 欧美电视剧在线观看完整版| 久久99伊人| 欧美日本韩国一区二区三区| 精品一区二区影视| 亚洲一区二区三区四区五区黄| 精品国产区一区| 欧美人妖巨大在线| 香蕉久久夜色精品国产| 欧美日韩1区2区3区| 精品一区二区久久久| 亚洲一区影音先锋| 久久久久久久一区| 制服.丝袜.亚洲.中文.综合| 国产精品综合| 欧美尤物一区| 国产精品中文字幕欧美| 一级特黄大欧美久久久| 久久午夜免费电影| 在线不卡中文字幕播放| 久久久久久久久久久一区| 亚洲午夜电影| av在线这里只有精品| 国产一区二三区| 偷拍自拍另类欧美| 亚洲欧美日韩国产中文在线| 久久人人超碰精品| 欧美色综合网站| 国产精品社区| 国内精品久久久久久久影视蜜臀| 成人高清免费观看| 久久97超碰国产精品超碰| 亚洲不卡av一区二区三区| 亚洲欧洲三级电影| 久久精品亚洲国产奇米99| 91精品国产麻豆| 欧美日韩一区二区三区在线看| 国产日本精品| 尤物在线精品| 91亚洲精品久久久蜜桃网站| 国产一区二区三区电影在线观看| 五月天网站亚洲| 一区二区三区成人| 国产精品久久久久久久久免费樱桃| 日韩精品专区在线影院观看| 欧美中文一区二区三区| 美女国产精品| 销魂美女一区二区三区视频在线| 激情五月***国产精品| 欧美久久成人| 欧美天天视频| 欧美日韩三区四区| 欧美日韩在线一二三| av成人动漫在线观看| 成人av片在线观看| 丁香激情综合国产| 国产成人精品午夜视频免费| 国产中文字幕一区| 美女免费视频一区二区| 日韩av一区二区在线影视| 亚洲国产综合人成综合网站| 一区二区三区免费看视频| 亚洲码国产岛国毛片在线| 亚洲人成网站精品片在线观看| 中文字幕日本乱码精品影院| 国产精品福利一区| 亚洲丝袜美腿综合| 亚洲欧美另类小说| 亚洲欧美另类久久久精品| 一区二区三区国产| 亚洲成a人在线观看| 亚洲mv在线观看| 午夜电影一区二区三区| 青青国产91久久久久久| 日本vs亚洲vs韩国一区三区| 男人的天堂久久精品| 久久se精品一区精品二区| 国产精品中文字幕欧美| 成人午夜私人影院| 成人高清视频在线观看| 97国产一区二区| 欧美日韩99| 国产欧美三级| 在线观看亚洲精品| 91精品国产aⅴ一区二区| 欧美刺激脚交jootjob| 国产午夜精品福利|