Swoole 4.5.6ゼロコピーJSONまたはPHPの逆シーケンス化をサポート

2169 ワード

最新の4.5.6開発ブランチでは、下位層に2の特殊な関数が追加されました.
  • swoole_substr_json_decode
  • swoole_substr_unserialize

  • ここではなぜこの2つの関数を増やすのでしょうか.こんなシーンがありました.Swoole\Serverを使用してRPCサービスが実装され、EOFプロトコルまたは長さプロトコル通信方式では、1つのパケットは3の部分から構成され得る.
    $packet = $header + $body + $footer

    通常、$headerおよび$footerは比較的小さく、$bodyは比較的大きく、$bodyJSONまたはPHPのシーケンス化フォーマットを使用することができる.$bodyのデータを解析するには、substr$bodyの文字列フォーマットデータを取得してから、json_decodeunserializeの操作を行う必要があります.
    これにより、メモリコピーが1回発生し、$body_str = substr($packet, $header_length)のプロセスで一時文字列変数が作成され、$body = json_decode($body_str)が逆シーケンス化されると、この変数は解放されます.
    //     substr,         ,  $packet       $body_str
    $body_str = substr($packet, 4, strlen($packet) - 4 - 2);
    //        $body_str         ,         
    $body = json_decode($body_str, true);

    新しい2つの関数を使用すると、substr の操作を1つにすることができます.メモリのコピーを1回減らすことで、パフォーマンスが向上します.
    $body = swoole_substr_json_decode($packet, $header_length);
    $body = swoole_substr_unserialize($packet, $header_length);

    あつりょくそくてい
    ";
    
    $n = 100000;
    
    $s = microtime(true);
    while($n--) {
        $l = strlen($str) - 6;
        // var_dump(unserialize(substr($str, 4, $l)));
        var_dump(swoole_substr_unserialize($str, 4, $l));
    }
    echo "cost: ".(microtime(true)-$s)."n";
    swoole_substr_unserializeを使用すると、substr + unserializeに比べてパフォーマンスが向上します.
    htf@htf-ThinkPad-T470p:~/workspace/debug$ php s.php
    cost: 2.2559139728546
    htf@htf-ThinkPad-T470p:~/workspace/debug$ php s.php
    cost: 1.9821600914001