У меня странная проблема с производительностью Thrift 0.8 для PHP как для сервера, так и для клиента.У меня есть два теста, использующих простой вызов сервера echo (), который просто возвращает строку, которую вы ему отправили.
- Тест 1: открыть () транспорт, 5 раз вызвать echo () и закрыть () транспорт.
- Тест 2: цикл 5 раз: транспорт open (), вызов echo (), close () транспорт.
Что?Тест 2 открывает и закрывает сокет для каждого вызова?Это должно быть очень медленно!
Вот что странно: Тест 2 в 40 раз быстрее, чем Тест 1, примерно 1 мс за итерацию против 40 мс за итерацию.
Вот основная идея.
$socket = new TSocket($host);
$transport = new TBufferedTransport($socket, 1024, 1024);
$protocol = new TBinaryProtocol($transport);
// Test 2: Open and close the connection each time.
function testSingleCall($c, $transport, $protocol) {
$client = new \thrift\LocationsClient($protocol, $protocol);
$t1 = microtime(true);
for ($i = 0; $i < $c; $i++) {
$transport->open();
$v = $client->echoMessage($i);
$transport->close();
}
$t2 = microtime(true);
return (($t2 - $t1) * 1000) / $c; // miliseconds per call
}
// Test 1: multiple calls per transaction.
function testMultipleCall($c, $transport, $protocol) {
$client = new \thrift\LocationsClient($protocol, $protocol);
$t1 = microtime(true);
$transport->open();
for ($i = 0; $i < $c; $i++) {
$v = $client->echoMessage($i);
}
$transport->close();
$t2 = microtime(true);
return (($t2 - $t1) * 1000) / $c; // miliseconds per call
}
Есть идеи, что заставляет открывать и закрывать сокеты быстрее, чем повторное использование открытого сокета?
Обновление: медлительность при чтении заголовка сообщения, TBinaryProtocol :: readMessageBegin ().Первый вызов после открытия транспорта быстрый (<1 мс), в то время как все последующие вызовы на том же открытом транспорте очень медленные (38 мс) </p>