0

0

PHP 性能分析与实验:性能的微观分析(1)

php中文网

php中文网

发布时间:2016-06-13 08:54:28

|

1241人浏览过

|

来源于php中文网

原创

PHP 性能分析与实验:性能的微观分析(1)

在上一篇文章中,我们从 php 是解释性语言、动态语言和底层实现等三个方面,探讨了 php 性能的问题。本文就深入到 php 的微观层面,我们来了解 php 在使用和编写代码过程中,性能方面,可能需要注意和提升的地方。

在开始分析之前,我们得掌握一些与性能分析相关的函数。这些函数让我们对程序性能有更好的分析和评测。

一、性能分析相关的函数与命令

1.1、时间度量函数

平时我们常用 time() 函数,但是返回的是秒数,对于某段代码的内部性能分析,到秒的精度是不够的。于是要用 microtime 函数。而 microtime 函数可以返回两种形式,一是字符串的形式,一是浮点数的形式。不过需要注意的是,在缺省的情况下,返回的精度只有4位小数。为了获得更高的精确度,我们需要配置 precision。

立即学习PHP免费学习笔记(深入)”;

如下是 microtime 的使用结果。

  1. $start= microtime(true);
  2. echo $start."/n";
  3. $end = microtime(true);
  4. echo $end."/n";
  5. echo ($end-$start)."/n";

输出为:

  1. bash-3.2# phptime.php
  2. 1441360050.3286
  3. 1441360050.3292
  4. 0.00053000450134277

而在代码前面加上一行:

  1. ini_set("precision", 16);

输出为:

  1. bash-3.2# phptime.php
  2. 1441360210.932628
  3. 1441360210.932831
  4. 0.0002031326293945312

除了 microtime 内部统计之外, 还可以使用 getrusage 来取得用户态的时长。在实际的操作中,也常用 time 命令来计算整个程序的运行时长,通过多次运行或者修改代码后运行,得到不同的时间长度以得到效率上的区别。 具体用法是:time phptime.php ,则在程序运行完成之后,不管是否正常结束退出,都会有相关的统计。

  1. bash-3.2# time phptime.php
  2. 1441360373.150756
  3. 1441360373.150959
  4. 0.0002031326293945312
  5. real 0m0.186s
  6. user 0m0.072s
  7. sys 0m0.077s

因为本文所讨论的性能问题,往往分析上百万次调用之后的差距与趋势,为了避免代码中存在一些时间统计代码,后面我们使用 time 命令居多。

1.2、内存使用相关函数

分析内存使用的函数有两个:memory_ get_ usage、memory_ get_ peak_usage,前者可以获得程序在调用的时间点,即当前所使用的内存,后者可以获得到目前为止高峰时期所使用的内存。所使用的内存以字节为单位。

  1. $base_memory= memory_get_usage();
  2. echo "Hello,world!/n";
  3. $end_memory= memory_get_usage();
  4. $peak_memory= memory_get_peak_usage();
  5. echo $base_memory,"/t",$end_memory,"/t",($end_memory-$base_memory),"/t", $peak_memory,"/n";

输出如下:

  1. bash-3.2# phphelloworld.php
  2. Hello,world!
  3. 224400 224568 168 227424

可以看到,即使程序中间只输出了一句话,再加上变量存储,也消耗了168个字节的内存。

对于同一程序,不同 PHP 版本对内存的使用并不相同,甚至还差别很大。

  1. $baseMemory= memory_get_usage();
  2. class User
  3. {
  4. private $uid;
  5. function __construct($uid)
  6. {
  7. $this->uid= $uid;
  8. }
  9. }
  10. for($i=0;$i<100000;$i++)
  11. {
  12. $obj= new User($i);
  13. if ( $i% 10000 === 0 )
  14. {
  15. echo sprintf( '%6d: ', $i), memory_get_usage(), " bytes/n";
  16. }
  17. }
  18. echo " peak: ",memory_get_peak_usage(true), " bytes/n";

在 PHP 5.2 中,内存使用如下:

  1. [root@localhostphpperf]# php52 memory.php
  2. 0: 93784 bytes
  3. 10000: 93784 bytes
  4. …… 80000: 93784 bytes
  5. 90000: 93784 bytes
  6. peak: 262144 bytes

PHP 5.3 中,内存使用如下

magento(麦进斗)
magento(麦进斗)

Magento是一套专业开源的PHP电子商务系统。Magento设计得非常灵活,具有模块化架构体系和丰富的功能。易于与第三方应用系统无缝集成。Magento开源网店系统的特点主要分以下几大类,网站管理促销和工具国际化支持SEO搜索引擎优化结账方式运输快递支付方式客户服务用户帐户目录管理目录浏览产品展示分析和报表Magento 1.6 主要包含以下新特性:•持久性购物 - 为不同的

下载

  1. [root@localhostphpperf]# phpmemory.php
  2. 0: 634992 bytes
  3. 10000: 634992 bytes
  4. …… 80000: 634992 bytes
  5. 90000: 634992 bytes
  6. peak: 786432 bytes

可见 PHP 5.3 在内存使用上要粗放了一些。

PHP 5.4 – 5.6 差不多,有所优化:

  1. [root@localhostphpperf]# php56 memory.php
  2. 0: 224944 bytes
  3. 10000: 224920 bytes
  4. …… 80000: 224920 bytes
  5. 90000: 224920 bytes
  6. peak: 262144 bytes

而 PHP 7 在少量使用时,高峰内存的使用,增大很多。

  1. [root@localhostphpperf]# php7 memory.php
  2. 0: 353912 bytes
  3. 10000: 353912 bytes
  4. …… 80000: 353912 bytes
  5. 90000: 353912 bytes
  6. peak: 2097152 bytes

从上面也看到,以上所使用的 PHP 都有比较好的垃圾回收机制,10万次初始化,并没有随着对象初始化的增多而增加内存的使用。PHP7 的高峰内存使用最多,达到了接近 2M。

下面再来看一个例子,在上面的代码的基础上,我们加上一行,如下:

$obj->self = $obj;

代码如下:

  1. $baseMemory= memory_get_usage();
  2. class User
  3. {
  4. private $uid;
  5. function __construct($uid)
  6. {
  7. $this->uid= $uid;
  8. }
  9. }
  10. for($i=0;$i<100000;$i++)
  11. {
  12. $obj= new User($i);
  13. $obj->self = $obj;
  14. if ( $i% 5000 === 0 )
  15. {
  16. echo sprintf( '%6d: ', $i), memory_get_usage(), " bytes/n";
  17. }
  18. }
  19. echo " peak: ",memory_get_peak_usage(true), " bytes/n";

这时候再来看看内存的使用情况,中间表格主体部分为内存使用量,单位为字节。

图表如下:

PHP 5.2 并没有合适的垃圾回收机制,导致内存使用越来越多。而5.3 以后内存回收机制导致内存稳定在一个区间。而也可以看见 PHP7 内存使用最少。把 PHP 5.2 的图形去掉了之后,对比更为明显。

可见 PHP7 不仅是在算法效率上,有大幅度的提升,在大批量内存使用上也有大幅度的优化尽管小程序的高峰内存比历史版本所用内存更多)。

1.3、垃圾回收相关函数

在 PHP 中,内存回收是可以控制的,我们可以显式地关闭或者打开垃圾回收,一种方法是通过修改配置,zend.enable_gc=Off 就可以关掉垃圾回收。 缺省情况下是 On 的。另外一种手段是通过 gc _enable()和gc _disable()函数分别打开和关闭垃圾回收。

比如在上面的例子的基础上,我们关闭垃圾回收,就可以得到如下数据表格和图表。

代码如下:

  1. gc_disable();
  2. $baseMemory= memory_get_usage();
  3. class User
  4. {
  5. private $uid;
  6. function __construct($uid)
  7. {
  8. $this->uid= $uid;
  9. }
  10. }
  11. for($i=0;$i<100000;$i++)
  12. {
  13. $obj= new User($i);
  14. $obj->self = $obj;
  15. if ( $i% 5000 === 0 )
  16. {
  17. echo sprintf( '%6d: ', $i), memory_get_usage(), " bytes/n";
  18. }
  19. }
  20. echo " peak: ",memory_get_peak_usage(true), " bytes/n";

分别在 PHP 5.3、PHP5.4 、PHP5.5、PHP5.6 、PHP7 下运行,得到如下内存使用统计表。

图表如下,PHP7 还是内存使用效率最优的。

从上面的例子也可以看出来,尽管在第一个例子中,PHP7 的高峰内存使用数是最多的,但是当内存使用得多时,PHP7 的内存优化就体现出来了。

这里值得一提的是垃圾回收,尽管会使内存减少,但是会导致速度降低,因为垃圾回收也是需要消耗 CPU 等其他系统资源的。Composer 项目就曾经因为在计算依赖前关闭垃圾回收,带来成倍性能提升,引发广大网友关注。详见:

https://github.com/composer/composer/commit/ac676f47f7bbc619678a29deae097b6b0710b799

在常见的代码和性能分析中,出了以上三类函数之外,还常使用的有堆栈跟踪函数、输出函数,这里不再赘述。




数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

2

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

2

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

0

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

29

2025.12.24

yandex外贸入口合集
yandex外贸入口合集

本专题汇总了yandex外贸入口地址,阅读下面的文章了解更多内容。

58

2025.12.24

添加脚注通用方法
添加脚注通用方法

本专题整合了添加脚注方法合集,阅读专题下面的文章了解更多内容。

1

2025.12.24

重启电脑教程汇总
重启电脑教程汇总

本专题整合了重启电脑操作教程,阅读下面的文章了解更多详细教程。

3

2025.12.24

纸张尺寸汇总
纸张尺寸汇总

本专题整合了纸张尺寸相关内容,阅读专题下面的文章了解更多内容。

5

2025.12.24

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

1

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 7.8万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号