Странная проблема производительности Thrift / PHP - PullRequest
1 голос
/ 12 января 2012

У меня странная проблема с производительностью 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>

...