PHP7函数类型限定是否对性能有影响?

PHP 作者:程序猿 2022-04-27 04:59:04

PHP7函数类型限定是否对性能有影响?下面本篇文章就来聊聊PHP7函数数据类型限定设定与否对性能的影响,希望对大家有所帮助!


本文主要通过简单的压测来探讨PHP7函数数据类型限定设定与否对性能的影响,另外,分享下自己两个工作中遇到的小问题及其应对,如有错误,恳请指正。

(1) 介绍

函数参数类型限定(包括返回值、成员属性)从PHP5开始支持的,但是支持的类型不多,PHP7做了扩展:int/string/bool/object 等

作用

避免错误调用,标明类型,只能传递同类型的参数,尤其多人协同开发时。推荐学习:《PHP视频教程》

如果不是可以自动转换数据类型,如下,当然前提是待转化类型可以正常转化

而本文正是测试类型限定对性能的影响程度


functiontestInt(int $intNum){

 var_dump($intNum);

}

testInt("123"); // int(123)

注意 参数、返回值如果跟设定的类型不一致时会报错,不是百分百确认的需要手动转化下

(2) 压测

运行环境

PHP 7.2.34

Laravel 5.8

AB 2.3

单机配置

型号名称 MacBook Pro

处理器名称 Quad-Core Intel Core i7

内存 8 GB

核总数 4

AB

使用AB (Apache Benchmark) 进行压测,由于不是正式的压测,所以此处只关心综合指标:Requests per second (平均每秒请求数)

主要参数

-n 压测请求数

-c 并发数

-p POST请求时指定所需携带参数的文件

-r 遇到错误响应不退出,操作系统有防高并发攻击保护措施 (apr_socket_recv: Connection reset by peer)

设置项目 设置两个 POST 接口,没有业务逻辑、中间件操作等,如下

/***** 1 普通接口 *****/

// CommonUserController

publicfunctioncreateUser(Request $request)

{

   $this->validate($request, [

       'name'=> 'required|string',

       'age'  => 'required|integer',

       'sex'  => ['required', Rule::in([1, 2])],

   ]);

   (newCommonUserModel())->createUser($request['age'], $request['name'], $request['sex'], $request['address'] jQuery33109352720383423578_1651006649829 '');

   returnresponse()->json(['status'=> 200, 'msg'=> 'ok']);

}

// CommonUserModel

publicfunctioncreateUser($sex, $age, $name, $address)

{

   if(empty($sex) || empty($age) || empty($name))  returnfalse;

   // 省略DB操作

   returntrue;

}

/***** 2 类型限定接口 *****/

// TypeUserController

publicfunctioncreateUser(Request $request): JsonResponse

{

   $this->validate($request, [

       'name'=> 'required|string',

       'age'  => 'required|integer',

       'sex'  => ['required', Rule::in([1, 2])],

   ]);

   (newTypeUserModel())->createUser($request['age'], $request['name'], $request['sex'], $request['address'] ?? '');

   returnresponse()->json(['status'=> 200, 'msg'=> 'ok']);

}

// TypeUserModel

publicfunctioncreateUser(int $age, string $name, int $sex, string $address): bool

{

   if(empty($sex) || empty($age) || empty($name)){

       returnfalse;

   }

   // 省略DB操作

   returntrue;

}

(3) 实施

共进行五次压测,配置及结果展示如下 (统一删除:| grep 'Requests per second')

/*****第一次*****/

// 类型限定接口 rps=456.16

ab -n 100  -c 10 -p '/tmp/ab_post_data.json'-T 'application:json'  http://www.jdsec.com/api/type/create_user

// 普通接口 rps=450.12

ab -n 100  -c 10 -p '/tmp/ab_post_data.json'-T 'application:json'  http://www.jdsec.com/api/common/create_user

/*****第二次*****/

// 类型限定接口 rps=506.74

ab -n 1000  -c 100 -p '/tmp/ab_post_data.json'-T 'application:json'  http://www.jdsec.com/api/type/create_user

// 普通接口 rps=491.24

ab -n 1000  -c 100 -p '/tmp/ab_post_data.json'-T 'application:json'  http://www.jdsec.com/api/common/create_user

/*****第三次*****/

// 类型限定接口 rps=238.43

ab -n 5000  -c 150 -p '/tmp/ab_post_data.json'-T 'application:json'-r http://www.jdsec.com/api/type/create_user

// 普通接口 rps=237.16

ab -n 5000  -c 150 -p '/tmp/ab_post_data.json'-T 'application:json'-r http://www.jdsec.com/api/common/create_user

/*****第四次*****/

// 类型限定接口 rps=209.21

ab -n 10000  -c 150 -p '/tmp/ab_post_data.json'-T 'application:json'-r http://www.jdsec.com/api/type/create_user

// 普通接口 rps=198.01

ab -n 10000  -c 150 -p '/tmp/ab_post_data.json'-T 'application:json'-r http://www.jdsec.com/api/common/create_user

/*****第五次*****/

// 类型限定接口 rps=191.17

ab -n 100000  -c 150 -p '/tmp/ab_post_data.json'-T 'application:json'-r http://www.jdsec.com/api/type/create_user

// 普通接口 rps=190.55

ab -n 100000  -c 150 -p '/tmp/ab_post_data.json'-T 'application:json'-r http://www.jdsec.com/api/common/create_user

(4) 结果

压测不算太严谨,结果仅供参考

类型限定对性能的提升没有预期的大,很微小,不过还是推荐这种写法


关注公众号:拾黑(shiheibook)了解更多

友情链接:

下软件就上简单下载站:https://www.jdsec.com/
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接