博采众长,精于一技。Live for love, work for dream.

PHP函数的实现原理及性能分析(二)

类方法
类方法其执行原理和用户函数是相同的,也是翻译成opcodes顺次调用。类的实现,zend用一个数据结构zend_class_entry来实现,里面保存了类相关的一些基本信息。这个entry是在php编译的时候就已经处理完成。
在 zend_function的common中,有一个成员叫做scope,其指向的就是当前方法对应类的zend_class_entry。关于php中面向对象的实现,这里就不在做更详细的介绍,今后将专门写一篇文章来详述php中面向对象的实现原理。就函数这一块来说,method实现原理和 function完全相同,理论上其性能也差不多,后面我们将做详细的性能对比。

性能对比
函数名长度对性能的影响

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

》》测试结果如下图
02.jpg

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

虽然函数名长度对性能有一定影响,但具体有多大呢?这个问题应该还是需要结合实际情况来考虑,如果一个函数本身比较复杂的话,那么对整体的性能影响并不大。一个建议是对于那些会调用很多次,本身功能又比较简单的函数,可以适当取一些言简意赅的名字。
函数个数对性能的影响

继续阅读 »

PHP函数的实现原理及性能分析(一)

作者: 百度工程师 HDK

前言
在任何语言中,函数都是最基本的组成单元。对于php的函数,它具有哪些特点?函数调用是怎么实现的?php函数的性能如何,有什么使用建议?本文将从原理出发进行分析结合实际的性能测试尝试对这些问题进行回答,在了解实现的同时更好的编写php程序。同时也会对一些常见的php函数进行介绍。

php函数的分类
在php中,横向划分的话,函数分为两大类: user function(内置函数) 和internal function(内置函数)。前者就是用户在程序中自定义的一些函数和方法,后者则是php本身提供的各类库函数(比如sprintf、array_push等)。用户也可以通过扩展的方法来编写库函数,这个将在后面介绍。对于user function,又可以细分为function(函数)和method(类方法),本文中将就这三种函数分别进行分析和测试。

php函数的实现
一个php函数最终是如何执行,这个流程是怎么样的呢?
要回答这个问题,我们先来看看php代码的执行所经过的流程。
01.jpg
从图1可以看到,php实现了一个典型的动态语言执行过程:拿到一段代码后,经过词法解析、语法解析等阶段后,源程序会被翻译成一个个指令(opcodes),然后ZEND虚拟机顺次执行这些指令完成操作。Php本身是用c实现的,因此最终调用的也都是c的函数,实际上,我们可以把php看做是一个c开发的软件。通过上面描述不难看出,php中函数的执行也是被翻译成了opcodes来调用,每次函数调用实际上是执行了一条或多条指令。
对于每一个函数,zend都通过以下的数据结构来描述

继续阅读 »

Ubuntu 10.04安装Sphinx

1.安装依赖
在此之前,请先确保你已经安装mysql-server,否则,请参考Ubuntu 10.04安装Nginx+PHP+MySQL的安装mysql部分
sudo apt-get install libmysqlclien/t-dev

2.安装Sphinx
Sphinx 0.9.9及以前的版本,原生不支持实时索引,一般的做法是通过主索引+增量索引的方式来实现“准实时”索引,最新的1.10.1(trunk中,尚未发布)终于支持real-time index,查看SVN中文档,我们很容易利用Sphinx搭建一个按需索引(on demand index)的全文检索系统。

参考文章:http://filiptepper.com/2010/05/27/real-time-indexing-and-searching-with-sphinx-1-10-1-dev.html
或者
利用Sphinx实现实时全文检索
2.1 首先,从sphinxsearch的SVN下载最新的代码,编译安装:
svn checkout http://sphinxsearch.googlecode.com/svn/trunk sphinx
cd sphinx/
./configure --prefix=/usr/local/sphinx --with-mysql
make
make install

继续阅读 »

Ubuntu 10.04安装Nginx+PHP+MySQL

0.前言
本文为Ubuntu10.04下快速安装教程,如果你想在源码上编译安装,本文不适合你,但你可参考
在 Ubuntu 9.10 Server 上安装 Nginx 0.8.34
ubuntu安装 nginx,PHP,php-fpm
或我之前写的Ubuntu下安装Nginx + PHP-FPM +MySQL

1.安装PHP-FPM
1.1 添加第三方源
sudo add-apt-repository ppa:sushkov/personal
sudo apt-get update

1.2 安装php环境(请根据自己的应用来选择安装,我只是装PHP来测试,所以只装了最基本的组件)
sudo apt-get install php5-cli php5-common php5-suhosin php5-fpm php5-cgi php5-mysql

2.安装Nginx
2.1 添加第三方源
在/etc/apt/sources.list添加PPA的源
deb http://ppa.launchpad.net/jdub/devel/ubuntu lucid main
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E9EEF4A1
sudo apt-get update

2.2 安装Nginx
sudo apt-get install nginx
至此Nginx安装完成。

继续阅读 »

ubuntu 10.04安装jdk

ubuntu 10.04已经去掉 sun-java6-jdk 和 sun-java6-jre的软件包,ubuntu 官方声明:建议安装 openjdk-6 以取代 sun-java6-jre ,但如果你不能转换到openjdk-6下,仍可以继续使用 sun-java6-jre。

安装办法:
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk

返回顶部