百度工程师讲PHP函数的实现原理及性能分析(二),php函数
类方法
类方法其执行原理和用户函数是相同的,也是翻译成opcodes顺次调用。类的实现,zend用一个数据结构zend_class_entry来实现,里面保存了类相关的一些基本信息。这个entry是在php编译的时候就已经处理完成。
在 zend_function的common中,有一个成员叫做scope,其指向的就是当前方法对应类的zend_class_entry。关于php中面向对象的实现,这里就不在做更详细的介绍,今后将专门写一篇文章来详述php中面向对象的实现原理。就函数这一块来说,method实现原理和 function完全相同,理论上其性能也差不多,后面我们将做详细的性能对比。
性能对比
函数名长度对性能的影响
》》测试方法 对名字长度为1、2、4、8、16的函数进行比较,测试比较它们每秒可执行次数,确定函数名长度对性能的影 响
》》测试结果如下图
》》结果分析
从图上可以看出,函数名的长度对性能还是会有一定的影响。一个长度为1的函数和长度为16的 空函数调用 ,其性能差了1倍。分析一下源码不难找到原因,如前面叙述所说,函数调用的时候zend会先在一个全局的funtion_table中通过函数名查询相关信息,function_table是一个哈希表。必然的,名字越长查询所需要的时间就越多。 因此,在实际编写程序的时候,对多次调用的函数,名字建议不要太长。
虽然函数名长度对性能有一定影响,但具体有多大呢?这个问题应该还是需要结合实际情况来考虑,如果一个函数本身比较复杂的话,那么对整体的性能影响并不大。一个建议是对于那些会调用很多次,本身功能又比较简单的函数,可以适当取一些言简意赅的名字。
函数个数对性能的影响
》》测试方法
在以下三种环境下进行函数调用测试,分析结果:1.程序仅包含1个函数 2.程序包含100个函数 3.程序包含1000个函数。测试这三种情况下每秒所能调用的函数次数
》》测试结果如下图
》》结果分析
从测试结果可以看出,这三种情况下性能几乎相同,函数个数增加时性能下降微乎其微,可以忽略。从实现原理分析,几种实现下唯一的区别在于函数获取的部分。如前文所述,所有的函数都放在一个hash表中,在不同个数下查找效率都应该还是接近于O(1),所以性能差距不大。
不同类型函数调用消耗
》》测试方法
选取用户函数、类方法、静态方法、内置函数各一种,函数本身不做任何事情,直接返回,主要测试空函数调用的消耗。测试结果为每秒可执行次数 测试中为去除其他影响,所有函数名字长度相同
》》测试结果如下图
》》结果分析
通过测试结果可以看到,对于用户自己编写的php函数,不管是哪种类型,其效率是差不多的,均在280w/s左右。如我们预期,即使是空调,内置函数其效率也要高很多,达到780w/s,是前者是3倍。可见,内置函数调用的开销还是远低于用户函数。从前面原理分析可知主要差距在于用户函数调用时初始化符号表、接收参数等操作。
内置函数和用户函数性能对比
》》测试方法
内置函数和用户函数的性能对比,这里我们选取几个常用的函数,然后用php实现相同功能的函数进行一下性能对比。测试中,我们选取字符串、数学、数组中各一个典型进行对比,这几个函数分别是字符串截取(substr)、10进制转2进制(decbin)、求最小值(min)和返回数组中的所以 key(array_keys)。
》》测试结果如下图
》》结果分析
从测试结果可以看出,如我们预期,内置函数在总体性能上远高于普通用户函数。尤其对于涉及到字符串类操作的函数,差距达到了1个数量级。因此,函数使用的一个原则就是如果某功能有相应的内置函数,尽量使用它而不是自己编写php函数。对于一些涉及到大量字符串操作的功能,为提高性能,可以考虑用扩展来实现。比如常见的富文本过滤等。
和C函数性能对比
》》测试方法
我们选取字符串操作和算术运算各3种函数进行比对,php用扩展实现。三种函数是简单的一次算法运算、字符串比较和多次的算法运算。除了本身的两类函数外,还会测试将函数空调开销去掉后的性能,一方面比对一下两种函数(c和php内置)本身的性能差异,另外就是侧面印证空调函数的消耗 测试点为执行10w次操作的时间消耗
》》测试结果如下图
》》结果分析
内置函数和C函数的开销在去掉php函数空调用的影响后差距较小,随着函数功能越来越复杂,双方性能趋近于相同。这个从之前的函数实现分析中也容易得到论证,毕竟内置函数就是C实现的。函数功能越复杂,c和php的性能差距越小 相对c来说,php函数调用的开销大很多,对于简单函数来说性能还是有一定影响。因此php中函数不宜嵌套封装太深。
伪函数及其性能
在php中,有这样一些函数,它们在使用上是标准的函数用法,但底层实现却和真正函数调用完全不同,这些函数不属于前文提到的三种function中的任何一类,其实质是一条单独的opcode,这里估且叫做伪函数或者指令函数。
如上所说,伪函数使用起来和标准的函数并无二致,看起来具有相同的特征。但是他们最终执行的时候是被zend反映成了一条对应的指令(opcode)来调用,因此其实现更接近于if、 for、算术运算等操作。
》》php中的伪函数
isset
empty
unset
eval
通过上面的介绍可以看出,伪函数由于被直接翻译成指令来执行,和普通函数相比少了一次函数调用所带来的开销,因此性能会更好一些。我们通过如下测试来做一个对比。 Array_key_exists和isset两者都可以判断数组中某个key是否存在,看一下他们的性能
从图上可以看出,和 array_key_exists相比,isset性能要高出很多,基本是前者的4倍左右,而即使是和空函数调用相比,其性能也要高出1倍左右。由此也侧面印证再次说明了php函数调用的开销还是比较大的。

7月14日消息,百度昨日宣布开源其旗下的MQTTBroker消息中间件BifroMQ,该消息中间件是由Java实现,具有高性能和分布式的特点。据称,BifroMQ是百度智能云物联网核心套件IoTCore的基础技术之一。BifroMQ采用了Serverless架构,并且无缝集成了原生的多租户支持。该消息中间件源自百度物联网团队多年的技术积累,旨在支持构建大规模的物联网设备连接和消息系统。据小编了解,BifroMQ采用了负载独立子集群设计,可以高效处理连接会话、消息转发和消息存储等工作负载。各子集群

PHP实现对接百度智能分类接口的简单指南近年来,随着人工智能的快速发展,智能分类技术被广泛应用于许多领域。百度智能分类接口就是其中一种应用,它可以根据传入的文本数据对其进行分类,帮助我们更好地理解文本的内容。本文将介绍如何使用PHP语言对接百度智能分类接口,并给出相应的代码示例。一、准备工作注册百度开发者账号并登录。创建一个应用并获取应用的APIKey和S

PHP实现对接百度语音识别接口的步骤与注意事项前言:随着人工智能技术的快速发展,语音识别技术也逐渐成熟并被广泛应用。百度语音识别接口是一款强大的云端语音识别服务,提供丰富的功能和灵活的配置选项,方便开发者根据自己的需求进行定制化开发。本文将利用PHP语言来实现对接百度语音识别接口的操作步骤,并对注意事项进行详细介绍。步骤一:申请百度语音识别接口首先,我们需要

据本站8月9日16时许报道,百度旗下产品出现了大规模故障,例如百度网盘在使用过程中出现了视频播放失败的情况,其他业务也有用户反映无法打开或崩溃的现象。经过本站的调查,发现是由于百度CDN服务异常所致百度网盘回应称,对此问题十分抱歉并正在紧急修复中,请耐心等待,感谢您的理解五分钟后,百度网盘回复说问题已解决,请您尝试重新登录,感谢您的支持CDN(内容分发网络)通过将源站内容分发至全球各地的加速节点,使用户在请求网站资源时能够被调度至距离最近的加速节点,从而直接获得所需内容,提高用户对网站资源的访问

PHP如何对接百度文心一言接口?百度文心一言接口是一个提供随机返回一句文心话的接口,使用起来非常简单。本文将介绍PHP如何对接百度文心一言接口,并提供代码示例。首先,我们需要申请百度文心一言接口的访问权限。在百度开放平台上创建一个应用,并获取到相应的APIKey。接下来,我们可以使用PHP中的cURL库来发送HTTP请求并获取接口返回的数据。下面是一个简单

使用Python实现百度图像识别API对接教程一、介绍随着人工智能的发展,图像识别技术已广泛应用于各个领域。而百度图像识别API是一款强大而易用的图像识别工具,可以帮助开发者快速实现图像分类、物体检测、图像搜索等功能。本文将详细介绍如何使用Python语言对接百度图像识别API,并给出代码示例。二、准备工作注册百度云账号首先,你需要在百度云官网注册一个账号,

3月16日,百度「文心一言」发布了!「文心一言」的整场发布会,总体感觉就是太过潦草了,感觉准备的不够充分,发布会有点为了开发布会而开发布会了。

Python编写代码实现百度人脸识别API对接,实现人脸特征分析人脸识别技术近年来快速发展,广泛应用于安全监控、用户认证、人脸搜索等领域。百度人脸识别API是一种强大的工具,提供了丰富的人脸特征分析功能。本文将介绍如何使用Python编写代码,通过对接百度人脸识别API实现人脸特征分析。首先,我们需要准备好Python开发环境。建议使用Python3.x版


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

WebStorm Mac版
好用的JavaScript开发工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Dreamweaver CS6
视觉化网页开发工具

Atom编辑器mac版下载
最流行的的开源编辑器

SublimeText3 英文版
推荐:为Win版本,支持代码提示!