Swoole 4.5.6ゼロコピーJSONまたはPHPの逆シーケンス化をサポート
最新の
ここではなぜこの2つの関数を増やすのでしょうか.こんなシーンがありました.
通常、
これにより、メモリコピーが1回発生し、
新しい2つの関数を使用すると、
あつりょくそくてい
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
は比較的大きく、$body
はJSON
またはPHP
のシーケンス化フォーマットを使用することができる.$body
のデータを解析するには、substr
で$body
の文字列フォーマットデータを取得してから、json_decode
とunserialize
の操作を行う必要があります.これにより、メモリコピーが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