奇怪的节俭/ PHP性能问题

时间:2012-01-12 01:51:40

标签: performance thrift

我的服务器和客户端的Thrift 0.8 for PHP都出现了奇怪的性能问题。我使用简单的echo()服务器调用进行了两次测试,该调用仅返回您发送给它的字符串。

  • 测试1:打开()传输,调用echo()5次并关闭()传输。
  • 测试2:循环5次:open()传输,调用echo(),close()传输。

什么?测试2是为每次通话打开和关闭插座吗?那一定非常慢!

奇怪的是:测试2比测试1快40倍,每次迭代大约1ms,每次迭代40ms。

这是基本想法。

$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()期间。打开传输后的第一个呼叫是快速的(<1ms),而同一个打开的传输上的所有后续呼叫都非常慢(38ms)

0 个答案:

没有答案