php yaf 2.3.5,Yaf 3.2.0发布

经过俩周多的重构,终于一咬牙今天发布了Yaf 3.2.0 beta, 要不然一直在想各种可能的优化点,不停的写,没完了, 🙂

这次的重构主要的出发点是把原来的Yaf对象从PHP的原生对象,改成了自定义的对象,怎么理解呢?

结构重构

之前的Yaf版本,比如我们拿Yaf_Request为例,它原来是一个PHP的对象,它有属性,用起来也跟用户在PHP中定义的对象一样,比如在之前的版本的Yaf中,在扩展中如果要获取Request对象的uri属性,那么:

zend_read_property(yaf_request_ce, obj, “uri”, sizeof(“uri”)-1, 1, NULL);

而在3.2.0以后,Yaf_Request对象成为了一个纯粹的C结构体:

typedef struct {

zend_uchar flags;

zend_string *method;

zend_string *module;

zend_string *controller;

zend_string *action;

zend_string *base_uri;

zend_string *uri;

zend_string *language;

zend_array *params;

zend_array *properties;

zend_object std;

} yaf_request_object;

这样以来,如果要获取uri的话,只需要(yaf_request_object)->uri,就可以了。这样性能就会有较为明显的提升。

所有的Yaf提供的类都被重写成这种形式,但这样以来就需要模拟PHP的对象行为,让用户在PHP脚本中也想获取Yaf_Request对象的uri属性的时候,也可以正常访问。所以这次的变更代码量比较大,几乎相当于重写了。

鉴于此,3.2.0目前发布为beta,虽然我做了很多的测试,也做到了能想到的最大可能去保证行为不发生变化,但还是不能保证完全对以前的版本兼容,大家如果在使用的过程中有任何问题,欢迎即时在Github反馈。

PSR-4 Autoloading

另外这次对自动加载器新增了PSR-4的支持,用户现在可以申明一个namespace的加载路径:

Yaf_Loader::getInstance()->registerNamespace(“/Foo/Bar”, “/var/lib/foo”);

那么所有在/Foo/Bar命名空间下的类就会从/var/lib/foo目录下查找:

/Foo/Bar/Dummy -> /var/lib/foo/Dummy.php

当然你也可以在配置文件中注册namespace path:

application.library./Foo/Bar=“/var/lib/foo”

性能提升

这次的重构本质上还是为了性能提升, 那实际效果如何呢?

为了能较为真实的反应测试,我采用了Yaf代码下的demo生成器tool/cg/yaf_cg来生成一个完整的Yaf应用框架,然后通过cachegrind来详细对比。

首先php-7.4 , yaf-3.1.4, 跑1000次 :

valgrind --tool=cachegrind /path-to-php74/bin/php-cgi -T 1000 index.php

Elapsed time: 6.020169 sec

==11203==

==11203== I refs: 232,666,798

==11203== I1 misses: 3,669,999

==11203== LLi misses: 10,163

==11203== I1 miss rate: 1.57%

==11203== LLi miss rate: 0.00%

==11203==

==11203== D refs: 102,960,876 (61,041,772 rd + 41,919,104 wr)

==11203== D1 misses: 5,065,700 ( 2,386,201 rd + 2,679,499 wr)

==11203== LLd misses: 909,412 ( 363,850 rd + 545,562 wr)

==11203== D1 miss rate: 4.9% ( 3.9% + 6.3% )

==11203== LLd miss rate: 0.8% ( 0.5% + 1.3% )

==11203==

==11203== LL refs: 8,735,699 ( 6,056,200 rd + 2,679,499 wr)

==11203== LL misses: 919,575 ( 374,013 rd + 545,562 wr)

==11203== LL miss rate: 0.2% ( 0.1% + 1.3% )

==11203==

==11203== Branches: 44,906,888 (42,750,345 cond + 2,156,543 ind)

==11203== Mispredicts: 4,112,611 ( 3,492,036 cond + 620,575 ind)

==11203== Mispred rate: 9.1% ( 8.1% + 28.7% )

然后php-7.4 yaf-3.2.0 也跑1000次:

Elapsed time: 4.658264 sec

==18814==

==18814== I refs: 171,236,262

==18814== I1 misses: 2,940,070

==18814== LLi misses: 10,007

==18814== I1 miss rate: 1.71%

==18814== LLi miss rate: 0.00%

==18814==

==18814== D refs: 75,584,870 (44,264,393 rd + 31,320,477 wr)

==18814== D1 misses: 4,302,787 ( 1,956,414 rd + 2,346,373 wr)

==18814== LLd misses: 908,224 ( 363,351 rd + 544,873 wr)

==18814== D1 miss rate: 5.6% ( 4.4% + 7.4% )

==18814== LLd miss rate: 1.2% ( 0.8% + 1.7% )

==18814==

==18814== LL refs: 7,242,857 ( 4,896,484 rd + 2,346,373 wr)

==18814== LL misses: 918,231 ( 373,358 rd + 544,873 wr)

==18814== LL miss rate: 0.3% ( 0.1% + 1.7% )

==18814==

==18814== Branches: 32,043,848 (30,444,567 cond + 1,599,281 ind)

==18814== Mispredicts: 3,033,847 ( 2,460,365 cond + 573,482 ind)

==18814== Mispred rate: 9.4% ( 8.0% + 35.8% )

我们可以看到,无论执行的指令树, 访问的内存数, 以及cache miss, branch miss都有很明显的下降。

好了,就简单介绍这么多,欢迎下载测试Yaf-3.2.0 后续我来慢慢完善文档。

来源:oschina

链接:https://my.oschina.net/u/4262172/blog/3274651

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值