首頁  >  文章  >  後端開發  >  聊聊PHP7函數類型限定是否對效能有影響? (測試探討)

聊聊PHP7函數類型限定是否對效能有影響? (測試探討)

青灯夜游
青灯夜游轉載
2022-02-15 10:35:392161瀏覽

PHP7函數型別限定是否對效能有影響?以下這篇文章就來聊聊PHP7函數資料型態限定設定與否對效能的影響,希望對大家有幫助!

聊聊PHP7函數類型限定是否對效能有影響? (測試探討)

本文主要透過簡單的壓測來探討PHP7函數資料型別限定設定與否對效能的影響,另外,分享下自己兩個工作中所遇到的小問題及其應對,如有錯誤,懇請指正。

PHP7函數型別限定

(1) 介紹

  • 函數參數型別限定(包含傳回值、成員屬性)從PHP5開始支援的,但是支援的類型不多,PHP7做了擴展:int/string/bool/object 等
  • #作用

      ##避免錯誤調用,標明類型,只能傳遞同類型的參數,尤其多人協同開發時。
    • 推薦學習:《

      PHP影片教學

    • 如果不是可以自動轉換資料類型,如下,當然前提是待轉換類型可以正常轉換
    • #而本文正是測試型別限定對效能的影響程度
    • function testInt(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
    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) 實作
共進行五次壓測,配置及結果展示如下(統一刪除:| 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) 結果
壓測不算太嚴謹,結果僅供參考

    類型限定對效能的提升沒有預期的大,很微小,不過還是推薦這種寫法

  • #更多程式相關知識,請造訪:

    程式設計影片
  • ! !

以上是聊聊PHP7函數類型限定是否對效能有影響? (測試探討)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除