qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 1/1] qtest: pre-buffer hex nibs


From: John Snow
Subject: Re: [Qemu-devel] [PATCH 1/1] qtest: pre-buffer hex nibs
Date: Thu, 07 May 2015 16:26:41 -0400
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.6.0


On 05/07/2015 04:21 PM, Eric Blake wrote:
> On 05/07/2015 11:51 AM, John Snow wrote:
>> Instead of converting each byte one-at-a-time and then sending
>> each byte over the wire, use sprintf() to pre-compute all of the
>> hex nibs into a single buffer, then send the entire buffer all at
>> once.
>> 
>> This gives a moderate speed boost to memread() and memwrite()
>> functions.
>> 
>> Signed-off-by: John Snow <address@hidden> ---
> 
>> -        qtest_send_prefix(chr); -        qtest_send(chr, "OK
>> 0x"); +        enc = g_malloc(2 * len + 1); for (i = 0; i < len;
>> i++) { -            qtest_sendf(chr, "%02x", data[i]); +
>> sprintf(&enc[i * 2], "%02x", data[i]);
> 
> Making a function call to sprintf() has a lot of overhead.  Isn't
> it even faster to open-code the conversion, something like:
> 

"Maybe."

> for (i = 0; i < len; i++) { const char digits[] =
> "0123456789abcdef"; enc[i * 2] = digits[data[i] >> 4]; enc[i * 2 +
> 1] = digits[data[i] & 0xf]; } enc[len * 2] = '\0';
> 

In practice I didn't see a statistical difference between my previous
nib-encoding function on my machine and this sprintf version, so I
opted not to add any new bit twiddling.

The bulk of the savings comes from not engaging the full socket send
for two bytes over and over and over again.

--js



reply via email to

[Prev in Thread] Current Thread [Next in Thread]