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