From: Mathias K Date: Fri, 4 Feb 2011 20:15:22 +0000 (+0100) Subject: buf_set_buf around 30% speed increase X-Git-Tag: v0.5.0-rc1~194 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=706284a8fd562d5a6e2c1f123f8cb366b7e49e7d;p=openocd 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 --- diff --git a/src/helper/binarybuffer.c b/src/helper/binarybuffer.c index 3a16cce6..e789e6ff 100644 --- a/src/helper/binarybuffer.c +++ b/src/helper/binarybuffer.c @@ -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++; + } + + if ( dq++ == 7 ) + { + dq = 0; + dst++; + } } - return dst; + return (uint8_t*)_dst; } uint32_t flip_u32(uint32_t value, unsigned int num)