PHP的纯CPU基准测试(PHP5.5.9 vs PHP7.2.1):

1.bench.php 可在PHP源代码的 php-src/Zend 目录

2.micro_bench.php 也可以在 PHP 源代码发布的 php-src/Zend 目录中找到

3.同时使用Unix time 命令来计时

time php micro_bench.php

PHP5.5.9结果:

empty_loop         0.124
func() 0.424 0.300
undef_func() 0.422 0.298
int_func() 0.343 0.219
$x = self::$x 0.277 0.153
self::$x = 0.351 0.227
isset(self::$x) 0.469 0.345
empty(self::$x) 0.498 0.374
$x = Foo::$x 0.286 0.162
Foo::$x = 0.271 0.147
isset(Foo::$x) 0.319 0.195
empty(Foo::$x) 0.360 0.236
self::f() 1.304 1.180
Foo::f() 1.396 1.272
$x = $this->x 0.392 0.268
$this->x = 0.500 0.376
$this->x += 0.434 0.310
++$this->x 0.271 0.147
--$this->x 0.221 0.097
$this->x++ 0.279 0.155
$this->x-- 0.244 0.120
isset($this->x) 0.238 0.114
empty($this->x) 0.240 0.116
$this->f() 0.711 0.587
$x = Foo::TEST 0.519 0.395
new Foo() 0.886 0.762
$x = TEST 0.204 0.080
$x = $_GET 0.250 0.126
$x = $GLOBALS['v'] 0.421 0.297
$x = $hash['v'] 0.254 0.130
$x = $str[] 0.362 0.238
$x = $a ?: null 0.248 0.124
$x = $f ?: tmp 0.331 0.207
$x = $f ? $f : $a 0.255 0.131
$x = $f ? $f : tmp 0.333 0.209
------------------------
Total 14.441 real 0m14.498s
user 0m12.110s
sys 0m0.024s

PHP7.2.1结果:

empty_loop         0.066
func() 0.302 0.236
undef_func() 0.505 0.439
int_func() 0.258 0.192
$x = self::$x 0.269 0.203
self::$x = 0.223 0.157
isset(self::$x) 0.212 0.146
empty(self::$x) 0.213 0.147
$x = Foo::$x 0.220 0.154
Foo::$x = 0.168 0.102
isset(Foo::$x) 0.100 0.034
empty(Foo::$x) 0.116 0.050
self::f() 0.183 0.117
Foo::f() 0.120 0.054
$x = $this->x 0.099 0.033
$this->x = 0.065 0.000
$this->x += 0.125 0.059
++$this->x 0.100 0.034
--$this->x 0.082 0.017
$this->x++ 0.120 0.054
$this->x-- 0.160 0.094
isset($this->x) 0.173 0.107
empty($this->x) 0.163 0.097
$this->f() 0.135 0.069
$x = Foo::TEST 0.125 0.059
new Foo() 0.337 0.271
$x = TEST 0.074 0.008
$x = $_GET 0.121 0.055
$x = $GLOBALS['v'] 0.185 0.119
$x = $hash['v'] 0.153 0.087
$x = $str[] 0.119 0.053
$x = $a ?: null 0.098 0.032
$x = $f ?: tmp 0.107 0.041
$x = $f ? $f : $a 0.101 0.035
$x = $f ? $f : tmp 0.095 0.029
------------------------
Total 5.694 real 0m5.756s
user 0m4.521s
sys 0m0.028s

性能提升接近三倍

micro_bench.php 测试脚本

<?php

function hallo() {
} function simpleucall($n) {
for ($i = 0; $i < $n; $i++)
hallo();
} function simpleudcall($n) {
for ($i = 0; $i < $n; $i++)
hallo2();
} function hallo2() {
} function simpleicall($n) {
for ($i = 0; $i < $n; $i++)
func_num_args();
} class Foo {
static $a = 0;
public $b = 0;
const TEST = 0; static function read_static($n) {
for ($i = 0; $i < $n; ++$i) {
$x = self::$a;
}
} static function write_static($n) {
for ($i = 0; $i < $n; ++$i) {
self::$a = 0;
}
} static function isset_static($n) {
for ($i = 0; $i < $n; ++$i) {
$x = isset(self::$a);
}
} static function empty_static($n) {
for ($i = 0; $i < $n; ++$i) {
$x = empty(self::$a);
}
} static function f() {
} static function call_static($n) {
for ($i = 0; $i < $n; ++$i) {
self::f();
}
} function read_prop($n) {
for ($i = 0; $i < $n; ++$i) {
$x = $this->b;
}
} function write_prop($n) {
for ($i = 0; $i < $n; ++$i) {
$this->b = 0;
}
} function assign_add_prop($n) {
for ($i = 0; $i < $n; ++$i) {
$this->b += 2;
}
} function pre_inc_prop($n) {
for ($i = 0; $i < $n; ++$i) {
++$this->b;
}
} function pre_dec_prop($n) {
for ($i = 0; $i < $n; ++$i) {
--$this->b;
}
} function post_inc_prop($n) {
for ($i = 0; $i < $n; ++$i) {
$this->b++;
}
} function post_dec_prop($n) {
for ($i = 0; $i < $n; ++$i) {
$this->b--;
}
} function isset_prop($n) {
for ($i = 0; $i < $n; ++$i) {
$x = isset($this->b);
}
} function empty_prop($n) {
for ($i = 0; $i < $n; ++$i) {
$x = empty($this->b);
}
} function g() {
} function call($n) {
for ($i = 0; $i < $n; ++$i) {
$this->g();
}
} function read_const($n) {
for ($i = 0; $i < $n; ++$i) {
$x = $this::TEST;
}
} } function read_static($n) {
for ($i = 0; $i < $n; ++$i) {
$x = Foo::$a;
}
} function write_static($n) {
for ($i = 0; $i < $n; ++$i) {
Foo::$a = 0;
}
} function isset_static($n) {
for ($i = 0; $i < $n; ++$i) {
$x = isset(Foo::$a);
}
} function empty_static($n) {
for ($i = 0; $i < $n; ++$i) {
$x = empty(Foo::$a);
}
} function call_static($n) {
for ($i = 0; $i < $n; ++$i) {
Foo::f();
}
} function create_object($n) {
for ($i = 0; $i < $n; ++$i) {
$x = new Foo();
}
} define('TEST', null); function read_const($n) {
for ($i = 0; $i < $n; ++$i) {
$x = TEST;
}
} function read_auto_global($n) {
for ($i = 0; $i < $n; ++$i) {
$x = $_GET;
}
} $g_var = 0; function read_global_var($n) {
for ($i = 0; $i < $n; ++$i) {
$x = $GLOBALS['g_var'];
}
} function read_hash($n) {
$hash = array('test' => 0);
for ($i = 0; $i < $n; ++$i) {
$x = $hash['test'];
}
} function read_str_offset($n) {
$str = "test";
for ($i = 0; $i < $n; ++$i) {
$x = $str[1];
}
} function issetor($n) {
$val = array(0,1,2,3,4,5,6,7,8,9);
for ($i = 0; $i < $n; ++$i) {
$x = $val ?: null;
}
} function issetor2($n) {
$f = false; $j = 0;
for ($i = 0; $i < $n; ++$i) {
$x = $f ?: $j + 1;
}
} function ternary($n) {
$val = array(0,1,2,3,4,5,6,7,8,9);
$f = false;
for ($i = 0; $i < $n; ++$i) {
$x = $f ? null : $val;
}
} function ternary2($n) {
$f = false; $j = 0;
for ($i = 0; $i < $n; ++$i) {
$x = $f ? $f : $j + 1;
}
} /*****/ function empty_loop($n) {
for ($i = 0; $i < $n; ++$i) {
}
} function getmicrotime()
{
$t = gettimeofday();
return ($t['sec'] + $t['usec'] / 1000000);
} function start_test()
{
ob_start();
return getmicrotime();
} function end_test($start, $name, $overhead = null)
{
global $total;
global $last_time;
$end = getmicrotime();
ob_end_clean();
$last_time = $end-$start;
$total += $last_time;
$num = number_format($last_time,3);
$pad = str_repeat(" ", 24-strlen($name)-strlen($num));
if (is_null($overhead)) {
echo $name.$pad.$num."\n";
} else {
$num2 = number_format($last_time - $overhead,3);
echo $name.$pad.$num." ".$num2."\n";
}
ob_start();
return getmicrotime();
} function total()
{
global $total;
$pad = str_repeat("-", 24);
echo $pad."\n";
$num = number_format($total,3);
$pad = str_repeat(" ", 24-strlen("Total")-strlen($num));
echo "Total".$pad.$num."\n";
} const N = 5000000; $t0 = $t = start_test();
empty_loop(N);
$t = end_test($t, 'empty_loop');
$overhead = $last_time;
simpleucall(N);
$t = end_test($t, 'func()', $overhead);
simpleudcall(N);
$t = end_test($t, 'undef_func()', $overhead);
simpleicall(N);
$t = end_test($t, 'int_func()', $overhead);
Foo::read_static(N);
$t = end_test($t, '$x = self::$x', $overhead);
Foo::write_static(N);
$t = end_test($t, 'self::$x = 0', $overhead);
Foo::isset_static(N);
$t = end_test($t, 'isset(self::$x)', $overhead);
Foo::empty_static(N);
$t = end_test($t, 'empty(self::$x)', $overhead);
read_static(N);
$t = end_test($t, '$x = Foo::$x', $overhead);
write_static(N);
$t = end_test($t, 'Foo::$x = 0', $overhead);
isset_static(N);
$t = end_test($t, 'isset(Foo::$x)', $overhead);
empty_static(N);
$t = end_test($t, 'empty(Foo::$x)', $overhead);
Foo::call_static(N);
$t = end_test($t, 'self::f()', $overhead);
call_static(N);
$t = end_test($t, 'Foo::f()', $overhead);
$x = new Foo();
$x->read_prop(N);
$t = end_test($t, '$x = $this->x', $overhead);
$x->write_prop(N);
$t = end_test($t, '$this->x = 0', $overhead);
$x->assign_add_prop(N);
$t = end_test($t, '$this->x += 2', $overhead);
$x->pre_inc_prop(N);
$t = end_test($t, '++$this->x', $overhead);
$x->pre_dec_prop(N);
$t = end_test($t, '--$this->x', $overhead);
$x->post_inc_prop(N);
$t = end_test($t, '$this->x++', $overhead);
$x->post_dec_prop(N);
$t = end_test($t, '$this->x--', $overhead);
$x->isset_prop(N);
$t = end_test($t, 'isset($this->x)', $overhead);
$x->empty_prop(N);
$t = end_test($t, 'empty($this->x)', $overhead);
$x->call(N);
$t = end_test($t, '$this->f()', $overhead);
$x->read_const(N);
$t = end_test($t, '$x = Foo::TEST', $overhead);
create_object(N);
$t = end_test($t, 'new Foo()', $overhead);
read_const(N);
$t = end_test($t, '$x = TEST', $overhead);
read_auto_global(N);
$t = end_test($t, '$x = $_GET', $overhead);
read_global_var(N);
$t = end_test($t, '$x = $GLOBALS[\'v\']', $overhead);
read_hash(N);
$t = end_test($t, '$x = $hash[\'v\']', $overhead);
read_str_offset(N);
$t = end_test($t, '$x = $str[0]', $overhead);
issetor(N);
$t = end_test($t, '$x = $a ?: null', $overhead);
issetor2(N);
$t = end_test($t, '$x = $f ?: tmp', $overhead);
ternary(N);
$t = end_test($t, '$x = $f ? $f : $a', $overhead);
ternary2(N);
$t = end_test($t, '$x = $f ? $f : tmp', $overhead);
total($t0, "Total");

[PHP] PHP的纯CPU基准测试(PHP5.5.9 vs PHP7.2.1)的更多相关文章

  1. Canvas原生API(纯CPU)计算并渲染三维图

    Canvas原生API(纯CPU)计算并渲染三维图 前端工程师学图形学:Games101 第三次作业 利用Canvas画三维中的三角形并使用超采样实现抗锯齿 最终完成功能 Canvas 原生API实现 ...

  2. php5.6.x到php7.0.x特性

    php5.6.x到php7.0.x特性 1.标量类型声明 字符串(string), 整数 (int), 浮点数 (float), 布尔值 (bool),callable,array,self,Clas ...

  3. 如何升级php版本---从php5.5.12 升级php7.1.5 wamp实践

    1.从官网下载一个php7.1.5 2.将刚下载的压缩包解压缩,修改命名为php7.1.5,即php+版本号. 3.将这个文件夹放在wamp/bin/php 目录下. 4.将原来版本的php5.5.1 ...

  4. PHP7 学习笔记(二)PHP5.9 升级到PHP7 遇到的一些坑的记录(php-fpm 图解)

    apache_event_php-fpm 示意图: nginx-php-fpm示意图: Worker-Master-Server TCP-Nginx_PHP Nginx-FastCGI 1.使用$_G ...

  5. [PHP] 2018年终总结

    去掉敏感信息后的不完整版 ==========================================================================2018年12月29日 记 ...

  6. PHP从PHP5.0到PHP7.1的性能全评测

    本文是最初是来自国外的这篇:PHP Performance Evolution 2016, 感谢高可用架构公众号翻译成了中文版, 此处是转载的高可用架构翻译后的文章从PHP 5到PHP 7性能全评测( ...

  7. PHP的性能演进(从PHP5.0到PHP7.1的性能全评测)

    本文是最初是来自国外的这篇:PHP Performance Evolution 2016, 感谢高可用架构公众号翻译成了中文版, 此处是转载的高可用架构翻译后的文章从PHP 5到PHP 7性能全评测( ...

  8. 从PHP5.0到PHP7.1的性能全评测

    本文是最初是来自国外的这篇:PHP Performance Evolution 2016, 感谢高可用架构公众号翻译成了中文版, 此处是转载的高可用架构翻译后的文章从PHP 5到PHP 7性能全评测( ...

  9. 数据库性能高校:CPU使用过高(下)

    CPU使用率过高的常见原因 查询优化器会尽量从CPU,IO和内存资源成本最小的角度,找到最高效的数据访问方式.如果没有正确的索引,或者写的语句本身就会忽略索引, 又或者不准确的统计信息等情况下,查询计 ...

随机推荐

  1. 50余本中外Python电子教程及源码下载地址

    链接:http://pan.baidu.com/s/1c0VTwsC 密码:hapu

  2. MySQL数据库密码破解

    研究MySQL数据库的加解密方式,在网络攻防过程中具有重要的意义:试想一旦获取了网站一定的权限后,如果能够获取MySQL中保存用户数据,通过解密后,即可通过正常途径来访问数据库:一方面可以直接操作数据 ...

  3. [javascript]——将变量转化为字符串

    这是一个非常常用,但是我自己却经常忘记的一个方法: var item = 'textssdf'; console.log("'"+item+"'") > ...

  4. 编程大牛 Bruce Eckel 对新程序员的忠告

    简评:作者 Bruce Eckel 是编程界的大牛,著有大名鼎鼎的<Thinking in C++>和<Thinking in Java>.本文是他对程序员(尤其是新手)的忠告 ...

  5. Mac中搭建 iOS 的 React Native 环境

    手把手教你在Mac中搭建iOS的 React Native环境 http://www.cnblogs.com/damnbird/p/6074607.html 准备工作 1.你需要一台Mac电脑..(这 ...

  6. day 11课后作业

    # -*- coding: utf-8 -*-# @Time : 2019/1/3 20:03# @Author : Endless-cloud# @Site : # @File : day 11 课 ...

  7. 人工鱼群算法超详细解析附带JAVA代码

    01 前言 本着学习的心态,还是想把这个算法写一写,给大家科普一下的吧. 02 人工鱼群算法 2.1 定义 人工鱼群算法为山东大学副教授李晓磊2002年从鱼找寻食物的现象中表现的种种移动寻觅特点中得到 ...

  8. Java_锁Synchronized

    锁(synchronized):既然线程之间是并发执行,就必然会有资源冲突的时候,如果不加以限制,很可能会出现死锁现象,这时就需要锁来对线程获取资源的限制程序中,可以给类,方法,代码块加锁.1.方法锁 ...

  9. spring与shiro配置详解

    1.加入shiro相关依赖的jar包 pom.xml部分内容如下: <dependency> <groupId>org.apache.shiro</groupId> ...

  10. C#-MVC-★不同层之间的传值方式★

    方式一:form表单提交(一对一传值) 例如: view层代码: action - 数据提交到的服务端(如Home控制器下的Insert动作) method - 提交数据的方式(post或get) n ...