微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

聊聊PHP7函数类型限定是否对性能有影响?测试探讨

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

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

PHP7函数类型限定

(1) 介绍

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

    @H_404_14@
  • 避免错误调用,标明类型,只能传递同类型的参数,尤其多人协同开发时。

    推荐学习:《PHP教程

  • 如果不是可以自动转换数据类型,如下,当然前提是待转化类型可以正常转化
  • 而本文正是测试类型限定对性能的影响程度
  • function testInt(int $intNum){
      var_dump($intNum);
    }
    testInt(123); // int(123)
  • 注意 参数、返回值如果跟设定的类型不一致时会报错,不是百分百确认的需要手动转化下
  • (2) 压测

    @H_404_14@
  • 运行环境

    @H_404_14@
  • PHP 7.2.34
  • Laravel 5.8
  • AB 2.3
  • 单机配置

    @H_404_14@
  • 型号名称 MacBook Pro
  • 处理器名称 Quad-Core Intel Core i7
  • 内存 8 GB
  • 核总数 4
  • AB

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

    @H_404_14@
  • -n 压测请求数
  • -c 并发数
  • -p POST请求时指定所需携带参数的文件
  • -r 遇到错误响应不退出,操作系统有防高并发攻击保护措施 (apr_socket_recv: Connection reset by peer)
  • 设置项目 设置两个 POST 接口,没有业务逻辑、中间件操作等,如下
  • /***** 1 普通接口 *****/
    // CommonUserController
    public function createuser(Request $request)
    {
        $this->validate($request, [
            'name' => 'required|string',
            'age'  => 'required|integer',
            'sex'  => ['required', Rule::in([1, 2])],
        ]);
        (new Commonusermodel())->createuser($request['age'], $request['name'], $request['sex'], $request['address'] ?? '');
        return response()->json(['status' => 200, 'msg' => 'ok']);
    }
    // Commonusermodel
    public function createuser($sex, $age, $name, $address)
    {
        if(empty($sex) || empty($age) || empty($name))  return false;
        // 省略DB操作
        return true;
    }
    
    /***** 2 类型限定接口 *****/
    // TypeUserController
    public function createuser(Request $request): JsonResponse
    {
        $this->validate($request, [
            'name' => 'required|string',
            'age'  => 'required|integer',
            'sex'  => ['required', Rule::in([1, 2])],
        ]);
        (new Typeusermodel())->createuser($request['age'], $request['name'], $request['sex'], $request['address'] ?? '');
        return response()->json(['status' => 200, 'msg' => 'ok']);
    }
    // Typeusermodel
    public function createuser(int $age, string $name, int $sex, string $address): bool
    {
        if(empty($sex) || empty($age) || empty($name)){
            return false;
        }
        // 省略DB操作
        return true;
    }

    (3) 实施

    @H_404_14@
  • 共进行五次压测,配置及结果展示如下 (统一删除:| grep 'Requests per second')
  • /*****第一次*****/
    // 类型限定接口 rps=456.16
    ab -n 100  -c 10 -p '/tmp/ab_post_data.json' -T 'application:json'  http://www.laravel_type_test.com/api/type/create_user
    // 普通接口 rps=450.12
    ab -n 100  -c 10 -p '/tmp/ab_post_data.json' -T 'application:json'  http://www.laravel_type_test.com/api/common/create_user
    
    /*****第二次*****/
    // 类型限定接口 rps=506.74
    ab -n 1000  -c 100 -p '/tmp/ab_post_data.json' -T 'application:json'  http://www.laravel_type_test.com/api/type/create_user
    // 普通接口 rps=491.24
    ab -n 1000  -c 100 -p '/tmp/ab_post_data.json' -T 'application:json'  http://www.laravel_type_test.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.laravel_type_test.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.laravel_type_test.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.laravel_type_test.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.laravel_type_test.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.laravel_type_test.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.laravel_type_test.com/api/common/create_user

    (4) 结果

    @H_404_14@
  • 压测不算太严谨,结果仅供参考
  • 类型限定对性能的提升没有预期的大,很微小,不过还是推荐这种写法

  • 更多编程相关知识,请访问:编程视频!!

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

    相关推荐