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

2022-02-15 13:00:54
函數型別限定是否對效能有影響?下面本篇文章就來聊聊PHP7函數資料型別限定設定與否對效能的影響,希望對大家有所幫助!

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

PHP7函數型別限定

(1) 介紹

  • 函數引數型別限定(包括返回值、成員屬性)從PHP5開始支援的,但是支援的型別不多,PHP7做了擴充套件:int/string/bool/object 等
  • 作用

    • 避免錯誤呼叫,標明型別,只能傳遞同型別的引數,尤其多人協同開發時。

      推薦學習:《》

    • 如果不是可以自動轉換資料型別,如下,當然前提是待轉化型別可以正常轉化
    • 而本文正是測試型別限定對效能的影響程度
    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函數型別限定是否對效能有影響?(測試探討)的詳細內容,更多請關注TW511.COM其它相關文章!