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