Details
Description
While decoding simple requests, observed that the time to decode was growing much faster than expected. A 25k file would take 3 seconds to decode while a 570k file was taking approximately 45 minutes. The Ruby implementation does not exhibit a similar issue; above 570k file takes about 3 seconds to decode. Profiled the code and found that the problem lies in AvroStringIO::read($len) - repeated calls to array_slice seem to cause the issue. Replaced the call to array_slice with the following and now the 570k file is processed in about 5 seconds. I will submit the patch shortly as well but here is the new code:
class AvroStringIO extends AvroIO
{
...
public function read($len)
{
$this->check_closed();
//$read = array_slice($this->buffer, $this->current_index, $len);
$read=array();
for($i=$this->current_index; $i<($this->current_index+$len); $i++)
$read []=$this->buffer[$i];
...