diff options
author | Mathias K <kesmtp@freenet.de> | 2011-02-04 21:15:22 +0100 |
---|---|---|
committer | Øyvind Harboe <oyvind.harboe@zylin.com> | 2011-02-08 09:39:59 +0100 |
commit | 706284a8fd562d5a6e2c1f123f8cb366b7e49e7d (patch) | |
tree | 0f3f75dcc6cea75c71853ec716ad6b59dfb28f26 /src/helper | |
parent | 5ca7cbe2d232fcaff32598af1ef5e962e704c004 (diff) | |
download | openocd+libswd-706284a8fd562d5a6e2c1f123f8cb366b7e49e7d.tar.gz openocd+libswd-706284a8fd562d5a6e2c1f123f8cb366b7e49e7d.tar.bz2 openocd+libswd-706284a8fd562d5a6e2c1f123f8cb366b7e49e7d.tar.xz openocd+libswd-706284a8fd562d5a6e2c1f123f8cb366b7e49e7d.zip |
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
Diffstat (limited to 'src/helper')
-rw-r--r-- | src/helper/binarybuffer.c | 29 |
1 files changed, 22 insertions, 7 deletions
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) |