Возможно, я несколько упустил суть Protobufs, но я потратил некоторое время на его реализацию, потому что надеялся получить чистую скорость по сравнению с моей текущей настройкой JSON.
Мой вариант использования такой: большое сложное приложение PHP (не веб-сайт) находится в стадии разработки и активно используется. Теперь мы пытаемся разбить наше приложение на более мелкие части, написанные на подходящем языке для каждой проблемы. Первый выделенный мною сервис выполняет обработку и преобразование строк, очень специфичных для предметной области и не очень интересных. Включает в себя множество регулярных выражений, пользовательский синтаксический анализ и т. Д.
Я реализовал логику своей предметной области в Go, которая прекрасно работает и ее очень легко освоить. Я привязал свою логику к простому JSON API, используя Go-Kit. Это очень простое преобразование, кодирование json просто до чего-то вроде {"v": "какая-то строка обычно 10-100 символов"}.
Производительность была хуже, чем у собственного PHP, что я считаю вполне приемлемым, учитывая накладные расходы на JSON и добавление передачи через сетевой уровень.
Однако что меня действительно удивило, так это то, что Protobuf не только не быстрее JSON, но и на 30-50% медленнее.
Мой .proto:
syntax = "proto3";
package pb;
option optimize_for = SPEED;
service StringStuff {
rpc DoStringStuff (StringReq) returns (StringRes) {}
}
message StringReq {
string in = 1;
}
message StringRes {
string out = 1;
}
Я использовал https://github.com/stanley-cheung/Protobuf-PHP и сгенерированный код proto php. Мой код клиента php выглядит так:
$client = new StringClient('localhost:50051', [
'credentials' => \Grpc\ChannelCredentials::createInsecure()]);
$string = new StringReq();
$string->setIn("some string...");
list($reply, $status) = $client->DoStringStuff($string)->wait();
Это работает, но, к моему удивлению, намного медленнее, чем JSON.
Мое единственное предположение: возможно ли, что реализация Protobufs на php настолько медленнее, чем json_decode, что в настоящее время PHP является очень плохим клиентом для Protobuf?
Или это нормально для небольших, простых применений, таких как передача одной строки, которую JSON должен превзойти, выполняя Protobuf?
Спасибо за любые мысли.
json_encode
написана на C ++ и была используется миллионами и оптимизирован с момента первого добавления.json_encode
будет во много раз быстрее, чем любая система упаковки на основе PHP. - person Xeoncross   schedule 25.01.2017