电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

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

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

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

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

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

統(tǒng)計(jì)對比使用魔術(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è)人能力有限,只能通過這種方式,如果你有更好的方案或者建議可以告訴我,謝謝,haha~

測試 __construct

首先我們先來看看構(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

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

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

__call

接著,我們來看看__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

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

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

__callStatic

接著,我們來看看__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

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

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

__set

接著,我們來看看__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

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

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

__get

接著,我們來看看__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

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

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

結(jié)語

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

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

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

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

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

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

答:通過整個(gè)測試我們可以看出使不使用魔法方法這之間的執(zhí)行時(shí)間差異大致都是在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/

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | 切铝机-数控切割机-型材切割机-铝型材切割机-【昆山邓氏精密机械有限公司】 | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 电镀标牌_电铸标牌_金属标贴_不锈钢标牌厂家_深圳市宝利丰精密科技有限公司 | 蔬菜清洗机_环速洗菜机_异物去除清洗机_蔬菜清洗机_商用洗菜机 - 环速科技有限公司 | 新疆乌鲁木齐网站建设-乌鲁木齐网站制作设计-新疆远璨网络 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 企小优-企业数字化转型服务商_网络推广_网络推广公司 | 扬州汇丰仪表有限公司 | 高防护蠕动泵-多通道灌装系统-高防护蠕动泵-www.bjhuiyufluid.com慧宇伟业(北京)流体设备有限公司 | 365文案网_全网创意文案句子素材站| 芜湖厨房设备_芜湖商用厨具_芜湖厨具设备-芜湖鑫环厨具有限公司 控显科技 - 工控一体机、工业显示器、工业平板电脑源头厂家 | 专业甜品培训学校_广东糖水培训_奶茶培训_特色小吃培训_广州烘趣甜品培训机构 | 辐射仪|辐射检测仪|辐射巡测仪|个人剂量报警仪|表面污染检测仪|辐射报警仪|辐射防护网 | 蜘蛛车-高空作业平台-升降机-高空作业车租赁-臂式伸缩臂叉装车-登高车出租厂家 - 普雷斯特机械设备(北京)有限公司 | 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 石油/泥浆/不锈钢防腐/砂泵/抽砂泵/砂砾泵/吸砂泵/压滤机泵 - 专业石油环保专用泵厂家 | 电动高尔夫球车|电动观光车|电动巡逻车|电动越野车厂家-绿友机械集团股份有限公司 | 逗网红-抖音网红-快手网红-各大平台网红物品导航 | 三轴曲线机-端子插拔力试验机|华杰仪器| 耐磨陶瓷,耐磨陶瓷管道_厂家-淄博拓创陶瓷科技 | 大功率金属激光焊接机价格_不锈钢汽车配件|光纤自动激光焊接机设备-东莞市正信激光科技有限公司 定制奶茶纸杯_定制豆浆杯_广东纸杯厂_[绿保佳]一家专业生产纸杯碗的厂家 | 常州律师事务所_常州律所_常州律师-江苏乐天律师事务所 | 2025福建平潭岛旅游攻略|蓝眼泪,景点,住宿攻略-趣平潭网 | 圆盘鞋底注塑机_连帮鞋底成型注塑机-温州天钢机械有限公司 | 航空铝型材,7系铝型材挤压,硬质阳*氧化-余润铝制品 | 制丸机,小型中药制丸机,全自动制丸机价格-甘肃恒跃制药设备有限公司 | 温州富欧金属封头-不锈钢封头厂家 | 地磅-电子地磅维修-电子吊秤-汽车衡-无人值守系统-公路治超-鹰牌衡器 | 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | 引领中高档酒店加盟_含舍·美素酒店品牌官网| 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | 胶原检测试剂盒,弹性蛋白检测试剂盒,类克ELISA试剂盒,阿达木单抗ELISA试剂盒-北京群晓科苑生物技术有限公司 | 祝融环境-地源热泵多恒系统高新技术企业,舒适生活环境缔造者! | 私人别墅家庭影院系统_家庭影院音响_家庭影院装修设计公司-邦牛影音 | 天津暖气片厂家_钢制散热器_天津铜铝复合暖气片_维尼罗散热器 | 大型冰雕-景区冰雕展制作公司,3D创意设计源头厂家-[赛北冰雕] | 粘弹体防腐胶带,聚丙烯防腐胶带-全民塑胶 | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 河南包装袋厂家_河南真空袋批发价格_河南服装袋定制-恒源达包装制品 | 武汉高低温试验箱_恒温恒湿试验箱厂家-武汉蓝锐环境科技有限公司 |