<menu id="uuzns"><dd id="uuzns"></dd></menu>
  1. <big id="uuzns"></big>
    <mark id="uuzns"></mark>
      <meter id="uuzns"></meter>
    1. <td id="uuzns"><menuitem id="uuzns"><mark id="uuzns"></mark></menuitem></td>
      1. 智能云排名SEO内测

        百度关键词优化三天上首页!同行都是朋友, ?#38431;?#19968;起互利共赢。谢绝一切非正规行业服务,?#34892;?#20197;下同行、团队、?#25945;?#21644;代理的支持:

        百度站长?#25945;āIP开发小组、SEO焦大老友、SEO每天一贴ZAC大哥、卢松松大哥、海瑶SEO兄弟、附子SEO兄弟、探索者SEO、帮站SEO好友、互点宝、超快排?#25945;?

        百亿互刷宝、下拉天下、SEO自学网、SEO研究?#34892;摹?#23567;明SEO、王德春SEO、马海祥博客、踏雪无痕?#19968;?#24037;作室、SEO云优化好友、云客网、杭州思亿欧、网赚吧、北京SEO韩非老弟

        需要了解以上同仁的相关信息,我们已经给你做好了搜索框,看右上角绿色那个,输入搜索即刻直达

        网站统计: 共有读稿:14437部 / 今日更新:篇 / 评论:19条 / 会员:75 名 / 阅读:1086085
        您好,请 【登陆】/【注册】
        软件内容页横幅广告
        您现在的位置:SEO?#25945;?/a> > PHP网站建设 >

        百度工程师讲PHP函数的实现原理及性能分析(二)

        2018.04.20

        浏览:

        【导语】如果您觉得本篇内容还不错,请点击文章下面的赞,然后分享给朋友哦!...

        百度工程师讲PHP函数的实现原理及性能分析(二)-破洛洛教学网...请看详情...

        seo

        seo

           这篇文章主要介绍了百度工程师讲PHP函数的实现原理及性能分析(二),本文讲解了类方法、性能对比、内置函数和用户函数性能对比等内容,需要的朋友可以参考下

          类方法

          类方法其执行原理和用户函数是相同的,也是翻译成opcodes顺次调用。类的实现,zend用一个数据结构zend_class_entry来实现,里面保存了类相关的一些基本信息。这个entry是在php编译的时候就已经处理完成。

          在 zend_function的common中,有一个成员叫做scope,其指向的就是当前方法对应类的zend_class_entry。关于php中面向对象的实现,这里就不在做更详细的介绍,今后将专门写一篇文章来详述php中面向对象的实现原理。就函数这一块?#27492;擔琺ethod实现原理和 function完全相同,理论上其性能也差不多,后面我们将做详细的性能对比。

          性能对比

          函数名长度对性能的影响

          》》测试方法 对名字长度为1、2、4、8、16的函数进行比较,测?#21592;?#36739;它们每秒可执行次数,确定函数名长度对性能的影 响

          》》测试结果如下图

        函数名长度对性能的影响

          》》结果分析

          从图上可以看出,函数名的长度对性能还是会有?#27426;?#30340;影响。一个长度为1的函数和长度为16的 空函数调用 ,其性能差了1倍。分析一下源码不难?#19994;?#21407;因,如前面叙述所说,函数调用的时候zend会先在一个全局的funtion_table中通过函数名查询相关信息,function_table是一个哈希表。必然的,名字越长查询所需要的时间就越多。 因此,在实?#26102;?#20889;程序的时候,对多次调用的函数,名字建议不要太长。

          虽然函数名长度对性能有?#27426;?#24433;响,但具体有多大呢?这个问题应该还是需要结合实?#26159;?#20917;来考虑,如果一个函数本身比较复杂的话,那么对整体的性能影响并不大。一个建议是对于?#20999;?#20250;调用很多次,本身功能?#30452;?#36739;简单的函数,可以?#23454;比?#19968;些言简意赅的名字。

          函数个数对性能的影响

          》》测试方法

          在以下三种环境下进行函数调用测试,分析结果:1.程序仅包含1个函数 2.程序包含100个函数 3.程序包含1000个函数。测试这三?#26234;?#20917;下每秒所能调用的函数次数

          》》测试结果如下图

        函数名长度对性能的影响

          》》结果分析

          从测试结果可以看出,这三?#26234;?#20917;下性能几乎相同,函数个数增加时性能下降微乎其微,可以忽略。从实现原理分析,几种实现下唯一的区别在于函数获取的部分。如前文所述,所有的函数都放在一个hash表中,在不同个数下查找效率都应该还是接近于O(1),所以性能差距不大。

          不同类型函数调用消耗

          》》测试方法

          选取用户函数、类方法、静态方法、内置函数各一种,函数本身不做任?#38382;?#24773;,直接返回,主要测试空函数调用的消耗。测试结果为每秒可执行次数 测试中为去除其他影响,所有函数名字长度相同

          》》测试结果如下图

          》》结果分析

          通过测试结果可以看到,对于用户自己编写的php函数,不管是哪种类型,其效率是差不多的,均在280w/s左右。如我们预期,?#35789;?#26159;空调,内置函数其效?#23460;?#35201;高很多,达到780w/s,是前者是3倍。可见,内置函数调用的开销还是远低于用户函数。从前面原理分析可知主要差距在于用户函数调用时初始化符号表、接收参数等操作。

          内置函数和用户函数性能对比

          》》测试方法

          内置函数和用户函数的性能对比,这里我们选取几个常用的函数,然后用php实现相同功能的函数进行一下性能对比。测试中,我们选取字符串、数学、数组中各一个典型进行对比,这几个函数分别是字符串截取(substr)、10进制转2进制(decbin)、求最小值(min)和返回数组中的所以 key(array_keys)。

          》》测试结果如下图

        不同类型函数性能的对比

          》》结果分析

          从测试结果可以看出,如我们预期,内置函数在总体性能上远高于普通用户函数。尤其对于涉及到字符串类操作的函数,差距达到了1个数?#32771;丁?#22240;此,函数使用的一个原则就是如果某功能有相应的内置函数,尽量使用它而不是自己编写php函数。对于一些涉及到大量字符串操作的功能,为提高性能,可以考虑用扩展来实现。比如常见的富文本过滤等。

          和C函数性能对比

          》》测试方法

          我们选取字符串操作和算术运算各3种函数进行比对,php用扩展实现。三种函数是简单的一次算法运算、字符串比较和多次的算法运算。除了本身的两类函数外,还会测试将函数空调开销去掉后的性能,一方面比对一下两种函数(c和php内置)本身的性能差异,另外就是侧面印证空调函数的消耗 测试点为执行10w次操作的时间消耗

          》》测试结果如下图

        c和php性能对比

          》》结果分析

          内置函数和C函数的开销在去掉php函数空调用的影响后差距较小,随着函数功能越来越复杂,双方性能趋近于相同。这个从之前的函数实现分析中也容易得到论证,毕竟内置函数就是C实现的。函数功能越复杂,c和php的性能差距越小 相对c?#27492;擔琾hp函数调用的开销大很多,对于简单函数?#27492;?#24615;能还是有?#27426;?#24433;响。因此php中函数不宜嵌套封装太深。

          伪函数及其性能

          在php中,有这样一些函数,它们在使用上是标准的函数用法,但底层实现却和真正函数调用完全不同,这些函数不属于前文提到的三种function中的任?#25105;?#31867;,其实质是一条单独的opcode,这里估且叫做伪函数或者指令函数。

          如上所说,伪函数使用起来和标准的函数并无二致,看起来具有相同的特征。但是他们最终执行的时候是被zend?#20174;?#25104;了一条对应的指令(opcode)来调用,因此其实现更接近于if、 for、算术运算等操作。

          》》php中的伪函数

          isset

          empty

          unset

          eval

          通过上面的介绍可以看出,伪函数由于被直接翻译成指令来执行,和普通函数相比少了一次函数调用所带来的开销,因此性能会更好一些。我们通过如下测试来做一个对比。 Array_key_exists和isset两者都可以判断数组中某个key是否存在,看一下他们的性能

        伪函数性能图表

          从图上可以看出,和 array_key_exists相比,isset性能要高出很多,基本是前者的4倍左右,而?#35789;?#26159;和空函数调用相比,其性能也要高出1倍左右。由此也侧面印证再次?#24471;?#20102;php函数调用的开销还是比较大的。

        0
        赞一个
        ☆?#19981;?#36825;篇文章吗?分享给你的好友吧!点击这里复制网址☆
        共有77人阅读,期待你的评论!评论
        请先登陆后才能发表评论哦!没账号?赶紧注册一个吧!
        最新评论
        热门标签
        回到顶部
        时时彩官方开奖

          <menu id="uuzns"><dd id="uuzns"></dd></menu>
        1. <big id="uuzns"></big>
          <mark id="uuzns"></mark>
            <meter id="uuzns"></meter>
          1. <td id="uuzns"><menuitem id="uuzns"><mark id="uuzns"></mark></menuitem></td>
              1. <menu id="uuzns"><dd id="uuzns"></dd></menu>
              2. <big id="uuzns"></big>
                <mark id="uuzns"></mark>
                  <meter id="uuzns"></meter>
                1. <td id="uuzns"><menuitem id="uuzns"><mark id="uuzns"></mark></menuitem></td>
                  1. 7乐彩走势图 广东26选5开奖8月23 中国福利彩票山东群英会 上海时时乐单选走势 甘肃快三热点早知道 克莉丝汀加盟 中国福利彩票开奖地方 贵州11选5奖金 中国福利彩票走势图删除 青海快3开奖结果昨天 本期三d推荐号码 赌场贵宾厅 体育彩票浙江6十1开奖时间 11选五 老11选5走势图