php魔术方法 效率,PHP常用魔术方法的性能探究

性能往往是衡量代码很重要的一个标准。我们日常编码中经常会用到一些魔术方法,这些PHP提供的魔术方法是否会影响我们程序的性能呢?是否需要减少魔术方法 的使用呢?本文将通过测试对比来了解魔术方法对性能的影响。

疑惑

魔术方法真的性能比较差吗?

PHP7里使用魔术方法的性能还是存在问题吗?

我们应该如何合理的使用魔术方法?

方案

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

统计对比使用魔术方法和不使用魔术方法脚本执行的时间差异

PHP5.6.26-1 下连续执行脚本n次

统计执行时间的平均值/最小值/最大值

PHP7.0.12-2 下连续执行脚本n次

统计执行时间的平均值/最小值/最大值

测试

__construct

首先我们先来看看构造函数__construct的实验,php脚本如下:<?php

/**

* 魔术方法性能探索

*

* 构造函数

*

* @author 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不使用魔术方法数据如下,单位微秒μs// PHP5.6中连续调用脚本10000次

sh test 10000 no_magic php5 construct

// 运行数据统计脚本

sh analysis ./logs/__construct_no_magic_php5.log 10000

// 结果

avg: 34μs

max: 483μs

min: 26μs

PHP5.6使用魔术方法数据如下,单位微秒μs// PHP5.6中连续调用脚本10000次

sh test 10000 magic php5 construct

// 运行数据统计脚本

sh analysis ./logs/__construct_magic_php5.log 10000

// 结果

avg: 28μs

max: 896μs

min: 20μs

PHP7.0不使用魔术方法数据如下,单位微秒μs// PHP7.0中连续调用脚本10000次

sh test 10000 no_magic php construct

// 运行数据统计脚本

sh analysis ./logs/__construct_no_magic_php.log 10000

// 结果

avg: 19μs

max: 819μs

min: 13μs

PHP7.0使用魔术方法数据如下,单位微秒μs// PHP7.0中连续调用脚本10000次

sh test 10000 magic php construct

// 运行数据统计脚本

sh analysis ./logs/__construct_magic_php.log 10000

// 结果

avg: 14μs

max: 157μs

min: 10μs

通过上面的数据我们可以看出:

使用__construct作为构造函数的脚本执行的平均时间是要快于使用类名作为构造函数的,大概快5到6微秒,不论是在php5.6还是php7.0中。

__call

接着,我们来看看__call的实验,php脚本如下:<?php

/**

* 魔术方法性能探索

*

* 构造函数

*

* @author 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不使用魔术方法数据如下,单位微秒μs// PHP5.6中连续调用脚本10000次

sh test 10000 no_magic php5 call

// 运行数据统计脚本

sh analysis ./logs/__call_no_magic_php5.log 10000

// 结果

avg: 27μs

max: 206μs

min: 20μs

PHP5.6使用魔术方法数据如下,单位微秒μs// PHP5.6中连续调用脚本10000次

sh test 10000 magic php5 call

// 运行数据统计脚本

sh analysis ./logs/__call_magic_php5.log 10000

// 结果

avg: 29μs

max: 392μs

min: 22μs

PHP7.0不使用魔术方法数据如下,单位微秒μs// PHP7.0中连续调用脚本10000次

sh test 10000 no_magic php call

// 运行数据统计脚本

sh analysis ./logs/__call_no_magic_php.log 10000

// 结果

avg: 16μs

max: 256μs

min: 10μs

PHP7.0使用魔术方法数据如下,单位微秒μs// PHP7.0中连续调用脚本10000次

sh test 10000 magic php call

// 运行数据统计脚本

sh analysis ./logs/__call_magic_php.log 10000

// 结果

avg: 18μs

max: 2459μs

min: 11μs

通过上面的数据我们可以看出:

使用__call的脚本执行的平均时间是要慢于不使用,大概慢2微秒,不论是在php5.6还是php7.0中。

__callStatic

接着,我们来看看__callStatic的实验,php脚本如下:<?php

/**

* 魔术方法性能探索

*

* 静态重载函数

*

* @author 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不使用魔术方法数据如下,单位微秒μs// PHP5.6中连续调用脚本10000次

sh test 10000 no_magic php5 callStatic

// 运行数据统计脚本

sh analysis ./logs/__callStatic_no_magic_php5.log 10000

// 结果

avg: 25μs

max: 129μs

min: 19μs

PHP5.6使用魔术方法数据如下,单位微秒μs// PHP5.6中连续调用脚本10000次

sh test 10000 magic php5 callStatic

// 运行数据统计脚本

sh analysis ./logs/__callStatic_magic_php5.log 10000

// 结果

avg: 28μs

max: 580μs

min: 20μs

PHP7.0不使用魔术方法数据如下,单位微秒μs// PHP7.0中连续调用脚本10000次

sh test 10000 no_magic php callStatic

// 运行数据统计脚本

sh analysis ./logs/__callStatic_no_magic_php.log 10000

// 结果

avg: 14μs

max: 130μs

min: 9μs

PHP7.0使用魔术方法数据如下,单位微秒μs// PHP7.0中连续调用脚本10000次

sh test 10000 magic php callStatic

// 运行数据统计脚本

sh analysis ./logs/__callStatic_magic_php.log 10000

// 结果

avg: 14μs

max: 159μs

min: 10μs

通过上面的数据我们可以看出:

在php5.6中使用__callStatic的脚本执行的平均时间是要慢于不使用,大概慢3微秒;在php7.0中使用__callStatic的脚本执行的平均时间是要大致等于不使用__callStatic的;

__set

接着,我们来看看__set的实验,php脚本如下:<?php

/**

* 魔术方法性能探索

*

* 设置私有属性__set

*

* @author 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不使用魔术方法数据如下,单位微秒μs// PHP5.6中连续调用脚本10000次

sh test 10000 no_magic php5 set

// 运行数据统计脚本

sh analysis ./logs/__set_no_magic_php5.log 10000

// 结果

avg: 31μs

max: 110μs

min: 24μs

PHP5.6使用魔术方法数据如下,单位微秒μs// PHP5.6中连续调用脚本10000次

sh test 10000 magic php5 set

// 运行数据统计脚本

sh analysis ./logs/__set_magic_php5.log 10000

// 结果

avg: 33μs

max: 138μs

min: 25μs

PHP7.0不使用魔术方法数据如下,单位微秒μs// PHP7.0中连续调用脚本10000次

sh test 10000 no_magic php set

// 运行数据统计脚本

sh analysis ./logs/__set_no_magic_php.log 10000

// 结果

avg: 15μs

max: 441μs

min: 11μs

PHP7.0使用魔术方法数据如下,单位微秒μs// PHP7.0中连续调用脚本10000次

sh test 10000 magic php set

// 运行数据统计脚本

sh analysis ./logs/__set_magic_php.log 10000

// 结果

avg: 17μs

max: 120μs

min: 11μs

通过上面的数据我们可以看出:

使用__set的脚本执行的平均时间是要慢于不使用,大概慢2微秒,不论是在php5.6还是php7.0中。

__get

接着,我们来看看__get的实验,php脚本如下:<?php

/**

* 魔术方法性能探索

*

* 读取私有属性__get

*

* @author 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 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不使用魔术方法数据如下,单位微秒μs// PHP5.6中连续调用脚本10000次

sh test 10000 no_magic php5 get

// 运行数据统计脚本

sh analysis ./logs/__get_no_magic_php5.log 10000

// 结果

avg: 28μs

max: 590μs

min: 20μs

PHP5.6使用魔术方法数据如下,单位微秒μs// PHP5.6中连续调用脚本10000次

sh test 10000 magic php5 get

// 运行数据统计脚本

sh analysis ./logs/__get_magic_php5.log 10000

// 结果

avg: 28μs

max: 211μs

min: 22μs

PHP7.0不使用魔术方法数据如下,单位微秒μs// PHP7.0中连续调用脚本10000次

sh test 10000 no_magic php get

// 运行数据统计脚本

sh analysis ./logs/__get_no_magic_php.log 10000

// 结果

avg: 16μs

max: 295μs

min: 10μs

PHP7.0使用魔术方法数据如下,单位微秒μs// PHP7.0中连续调用脚本10000次

sh test 10000 magic php get

// 运行数据统计脚本

sh analysis ./logs/__get_magic_php.log 10000

// 结果

avg: 19μs

max: 525μs

min: 12μs

通过上面的数据我们可以看出:

在php5.6中使用__get的脚本执行的平均时间是要大致等于不使用__get的;在php7.0中使用__get的脚本执行的平均时间是要慢于不使用,大概慢3微秒。

结语

这里主要测试了__construct(), __call(), __callStatic(), __get(), __set()这五个常用的且可有其他实现方式代替的魔法函数。通过上面的测试再回来解答我的疑惑

魔术方法真的性能比较差吗?

答:除了使用__construct之外,这里使用其他的魔法方法的时间大致慢10微秒以内。

PHP7里使用魔术方法的性能还是存在问题吗?

答:在PHP7中使用与不使用魔术方法之间的差异和在PHP5.6中近乎一致。

我们应该如何合理的使用魔术方法?

答:通过整个测试我们可以看出使不使用魔法方法这之间的执行时间差异大致都是在10微秒以内的,所以如果魔法方法可以很好的节省我们的开发成本和优化我们的代码结构,我们应该可以考虑牺牲掉这不到10微秒。而__construct是要快的,所以使用__construct应该没什么异议。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一图速览 | DTCC 2021大会,阿里云数据库技术大咖都聊了些什么?

简介&#xff1a; 3天9场干货分享&#xff0c;快来收藏吧&#xff01; 10月18日~10月20日&#xff0c; 由国内知名IT技术社区主办的数据库技术交流盛会——DTCC 2021 (第十一届中国数据库技术大会)在京圆满落幕。大会以“数造未来”为主题&#xff0c;重点围绕数据架构、人工智…

AI深入应用,生态越加开放,开发者的机会在哪里?

作者 | 宋慧 出品 | CSDN云计算 IT 在吞噬一切&#xff0c;也在吞噬地球的能源消耗。 现在&#xff0c;全球的数据中心耗去了全球用电的 2%&#xff0c;到 2030 年时这个数字很有可能上升到 8%。风电&#xff0c;是地球上仅次于火电、水电的第三大电力来源&#xff0c;风电、光…

Serverless 工程实践 | 自建 Apache OpenWhisk 平台

简介&#xff1a; OpenWhisk 是一个开源、无服务器的云平台&#xff0c;可以在运行时容器中通过执行扩展的代码响应各种事件&#xff0c;而无须用户关心相关的基础设施架构。 OpenWhisk 简介 OpenWhisk 是基于云的分布式事件驱动的编程服务。OpenWhisk 提供一种编程模型&…

php弹幕技术轮询,PHP实现长轮询消息实时推送功能代码

入口文件index.html反ajax推送.send{color:#555;text-align: left;}.require{color:blue;text-align: right;}.content_box{text-align: center;margin: 20px;border: 1px solid #ddd;padding: 20px;}消息框12发送连接$(function(){//发送消息$(#btn_send).click(function(){va…

阿里云消息队列 RocketMQ 5.0 全新升级:消息、事件、流融合处理平台

简介&#xff1a; RocketMQ5.0 的发布标志着阿里云消息从消息领域正式迈向了“消息、事件、流”场景大融合的新局面。未来阿里云消息产品的演进也将继续围绕消息、事件、流核心场景而开展。 从“消息”到“消息、事件、流”的大融合 消息队列作为当代应用的通信基础设施&…

Gartner发布2022年政府行业重要业务趋势:数字化与创新、基础设施等

供稿 | Gartner 出品 | CSDN 云计算 时至2022年&#xff0c;政府领导人继续面临疫情带来不断变化的挑战&#xff0c;包括社会和经济领域的不确定因素。在2020年至2021年这段刚开始应对疫情的时期&#xff0c;为了满足公民服务和远程办公的需求&#xff0c;全球数字化程度呈指数…

随机段子api php,给博客添加一个名言段子语句随机播放的功能(集成Hitokoto)

之前浏览张戈的博客&#xff0c;发现他的文章页点赞下方有个很有意思的东西&#xff0c;一列显示一段句子&#xff0c;刷新一下会重新生成另外一个&#xff0c;主要包含段子、台词等有意思的话。余斗的博客不少内容都是参考张戈博客&#xff0c;虽然发现这个有趣的玩意很久了&a…

实践分享丨构建云上私有池(虚拟IDC)的5种方案详解

简介&#xff1a; 云上私有池系列终篇终于来了&#xff0c;本文将重点介绍构建云上的私有池&#xff08;虚拟IDC&#xff09;的多种方案和各自的优缺点&#xff0c;并给出相关的性价比优化建议。 本文作者&#xff1a;阿里云技术专家李雨前 摘要 围绕私有池&#xff08;虚拟…

2021云栖大会开源引力峰会发布的战略合作,Grafana服务到底是什么?

简介&#xff1a; 这几天关注云栖大会的小伙伴一定会发现阿里巴巴合伙人、阿里云高级研究员蒋江伟&#xff08;小邪&#xff09;在云栖大会开源引力峰会的演讲中&#xff0c;特别提到了一个叫 Grafana 服务的产品&#xff0c;并特意花费一页 PPT 介绍了这一次合作。到底是一个什…

因为一个循环,CPU搞了个新技术

作者 | 轩辕之风O 来源 | 编程技术宇宙 好久不见&#xff0c;我叫阿Q&#xff0c;是CPU一号车间的员工。我所在的CPU有8个车间&#xff0c;也就是8个核心&#xff0c;咱们每个核心都可以同时执行两个线程&#xff0c;就是8核16线程&#xff0c;那速度杠杠滴。 我所在的一号车间…

php关键字高亮,php站内搜索并高亮显示关键字的实现代码

代码如下:require_once sqlTools.class.php;//封装类&#xff0c;可执行dql、dml语句$info$_POST[info];$sql"select name,password,email from user_500 where name like %$info% or password like %$info% or email like %$info%";$sqlToolsnew SqlTools();$res$sq…

AI圈内卷?天池团聚请来专家集体“问诊”

简介&#xff1a; 近期杭州云栖大会上出现了一个“数据博物馆”&#xff0c;最吸引眼球的“展品”&#xff0c;竟是行业大规模开源数据集。不仅数量多达上百个&#xff0c;还覆盖零售、文娱、工业、医疗、自然科学等数十个行业。既有来自真实业务场景的商品数据&#xff0c;也不…

2021双11上云狂欢节 | 爆款产品底价全面开售

一年一度的双11狂欢节终于来啦&#xff01;怎样用最少的钱获得最多的福利&#xff1f;下面这份攻略收藏好&#xff0c;这波活动快冲&#xff01; 双11主会场&#xff1a;http://click.aliyun.com/m/1000304310/ 01 领取双11上云加油包 阿里云官网已实名认证的注册会员用户皆可…

针对场景化痛点,锐捷网络推出极简光 2.X,以太全光网再下一城

极简光 2.X 方案&#xff0c;旨在针对各行业的需求和痛点找到更合适的解法&#xff0c;为各行业的客户呈现更为适配的新产品。 出品 | CSDN云计算 光进铜退趋势之下&#xff0c;全光网在快速发展。 不过&#xff0c;更进一步在各个行业技术实施中&#xff0c;用户的痛点则多种多…

轻博客框架 php,DouPHP轻博客 v1.6 Release 20200925

DouPHP轻博客系统&#xff0c;基于PHPMYSQL架构的&#xff0c;可以使用它快速搭建一个博客系统。DouPHP轻博客系统功能特点操作简单后台简约明了&#xff0c;从使用者而不是开发者的角度出发设计后台功能布局&#xff0c;完全不需要使用手册就可以轻松进行日常内容编辑工作。功…

阿里云GanosBase升级,发布首个云孪生时空数据库

简介&#xff1a; GanosBase是李飞飞带领的达摩院数据库与存储实验室联合阿里云共同研发的新一代位置智能引擎&#xff1b;本次重磅升级为V4.0版本&#xff0c;推出首个云孪生时空数据库。 作者 | 谢炯 来源 | 阿里技术公众号 导读&#xff1a; GanosBase是李飞飞带领的达摩院…

演进实录|不同阶段的企业如何搭建监控体系?

简介&#xff1a; 企业业务发展越来越迅速&#xff0c;对 IT 的要求也愈发严苛且复杂。这不仅仅体现在运维团队架构与工作流程上&#xff0c;也体现在工具选型与平台搭建上。 今天我们好好聊一下工具选型与平台搭建思路与实践关键点。来看看阿里云会给出如何的最佳实践&#xf…

用过留痕,谁动了我的档案?

本篇文章暨 CSDN《中国 101 计划》系列数字化转型场景之一。 《中国 101 计划——探索企业数字化发展新生态》为 CSDN 联合《新程序员》、GitCode.net 开源代码仓共同策划推出的系列活动&#xff0c;寻访一百零一个数字化转型场景&#xff0c;聚合呈现并开通评选通道&#xff0…

php在线考试系统模板下载,PHPEMS在线模拟考试系统 v6.1

PHPEMS在线模拟考试系统主要用于构建在线考试系统&#xff0c;如驾照、英语等练习系统。一、系统功能&#xff1a;1、强化训练测验&#xff0c;对知识点进行单独联系2、随机组卷练习&#xff0c;系统自动抽取题目进行练习3、手工组卷联系&#xff0c;通过教师平台手工组卷形成考…

媒体声音|阿里云数据库:一站式全链路数据管理与服务,引领云原生2.0时代

简介&#xff1a; 引领云原生数据库技术持续创新 这几年&#xff0c;云原生已成为阿里云的另一个标签&#xff0c;不仅最早布局云原生技术&#xff0c;拥有大量客户实践&#xff0c;更打造出丰富的云原生产品家族。尤其是数据库产品线&#xff0c;已进入云原生2.0阶段&#xf…