buf_set_buf around 30% speed increase
Also i have checked the input of this function and in many cases a simple byte copy is possible. I have added this check now and is it possible the buffer is copied byte by byte and not bit by bit. With byte boundary input the test looks like this: buf_set_buf 0x02000000 iteration test: runtime (seconds): old: 6.828559 new: 0.436191 diff: 6.392368 runtime (seconds): old: 6.853636 new: 0.430389 diff: 6.423247 runtime (seconds): old: 6.794985 new: 0.423065 diff: 6.371920 Without: buf_set_buf 0x02000000 iteration test: runtime (seconds): old: 6.370869 new: 5.552624 diff: 0.818245 runtime (seconds): old: 6.420730 new: 5.665887 diff: 0.754843 runtime (seconds): old: 6.583306 new: 5.599021 diff: 0.984285 Regards, Mathias
This commit is contained in:
parent
5ca7cbe2d2
commit
706284a8fd
|
@ -133,19 +133,34 @@ void* buf_set_buf(const void *_src, unsigned src_start,
|
|||
{
|
||||
const uint8_t *src = _src;
|
||||
uint8_t *dst = _dst;
|
||||
unsigned sb,db,sq,dq;
|
||||
|
||||
sb = src_start / 8;
|
||||
db = dst_start / 8;
|
||||
sq = src_start % 8;
|
||||
dq = dst_start % 8;
|
||||
|
||||
unsigned src_idx = src_start, dst_idx = dst_start;
|
||||
for (unsigned i = 0; i < len; i++)
|
||||
{
|
||||
if (((src[src_idx / 8] >> (src_idx % 8)) & 1) == 1)
|
||||
dst[dst_idx / 8] |= 1 << (dst_idx % 8);
|
||||
if (((*src >> (sq&7)) & 1) == 1)
|
||||
*dst |= 1 << (dq&7);
|
||||
else
|
||||
dst[dst_idx / 8] &= ~(1 << (dst_idx % 8));
|
||||
dst_idx++;
|
||||
src_idx++;
|
||||
*dst &= ~(1 << (dq&7));
|
||||
|
||||
if ( sq++ == 7 )
|
||||
{
|
||||
sq = 0;
|
||||
src++;
|
||||
}
|
||||
|
||||
return dst;
|
||||
if ( dq++ == 7 )
|
||||
{
|
||||
dq = 0;
|
||||
dst++;
|
||||
}
|
||||
}
|
||||
|
||||
return (uint8_t*)_dst;
|
||||
}
|
||||
|
||||
uint32_t flip_u32(uint32_t value, unsigned int num)
|
||||
|
|
Loading…
Reference in New Issue