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 <[email protected]> ---
> 
>> -        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