From: "Kirill A. Shutsemov" <kirill@shutemov.name> To: "Dmitry V. Levin" <ldv@altlinux.org>, Alexey Tourbin <at@altlinux.ru> Cc: "Alexey I. Froloff" <raorn@altlinux.org>, devel@lists.altlinux.org, Alexey Gladkov <legion@altlinux.ru>, "Kirill A. Shutemov" <kirill@shutemov.name> Subject: [devel] [PATCH 2/3] set.c: optimize putbits() Date: Fri, 26 Nov 2010 00:04:25 +0200 Message-ID: <1290722666-24606-3-git-send-email-kirill@shutemov.name> (raw) In-Reply-To: <1290722666-24606-1-git-send-email-kirill@shutemov.name> From: Kirill A. Shutemov <kirill@shutemov.name> Use bit operations instead of cycles. Signed-off-by: Kirill A. Shutemov <kirill@shutemov.name> --- lib/set.c | 22 ++++++++++++++++------ 1 files changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/set.c b/lib/set.c index 4b91dab..02a6c31 100644 --- a/lib/set.c +++ b/lib/set.c @@ -21,6 +21,7 @@ #define BITS_PER_LONG (sizeof(long) * BITS_PER_BYTE) #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_LONG) #define BIT(nr) (1UL << (nr)) +#define MASK(nbits) (BIT(nbits) - 1) static inline int get_bit(const unsigned long *bitmap, int offset) @@ -157,13 +158,22 @@ int char_to_num(int c) } static inline -void putbits(unsigned long *bitmap, int *offset, int c, int nbits) +void putbits(unsigned long *bitmap, int *offset, unsigned long c, int nbits) { - int i; + int quot, rem; + + assert(!(c & ~MASK(nbits))); + + quot = *offset / BITS_PER_LONG; + rem = *offset % BITS_PER_LONG; + + bitmap[quot] |= c << rem; + c >>= BITS_PER_LONG - rem; + + if (nbits + rem > (int) BITS_PER_LONG) + bitmap[quot + 1] = c; - for (i = 0; i < nbits; i++, (*offset)++) - if (c & BIT(i)) - set_bit(bitmap, *offset); + *offset += nbits; } /* Main base62 decoding routine: unpack base62 string into bitmap. */ @@ -208,7 +218,7 @@ int decode_base62(unsigned long *bitmap, const char *base62) break; } - putbits(bitmap, &offset, num6b, 4); + putbits(bitmap, &offset, num6b & MASK(4), 4); } return offset; -- 1.7.3.2
next prev parent reply other threads:[~2010-11-25 22:04 UTC|newest] Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top 2010-11-25 22:04 [devel] [PATCH 0/3] optimize rpmsetcmp() Kirill A. Shutsemov 2010-11-25 22:04 ` [devel] [PATCH 1/3] set.c: use packed bitmap for bit vector Kirill A. Shutsemov 2010-11-25 22:04 ` Kirill A. Shutsemov [this message] 2010-11-25 22:04 ` [devel] [PATCH 3/3] set.c: optimize decode_golomb() Kirill A. Shutsemov 2010-11-26 8:35 ` [devel] [PATCH 0/3] optimize rpmsetcmp() Kirill A. Shutemov 2010-11-30 0:35 ` Dmitry V. Levin 2010-12-02 21:48 ` Dmitry V. Levin 2010-12-04 13:02 ` Alexey Tourbin 2010-12-04 16:30 ` Dmitry V. Levin 2010-12-04 16:55 ` Alexey Tourbin 2010-12-04 15:06 ` Alexey Tourbin 2010-12-04 16:29 ` Dmitry V. Levin 2010-12-04 16:42 ` Alexey Tourbin 2010-12-04 16:52 ` Dmitry V. Levin 2010-12-04 17:05 ` Alexey Tourbin 2010-12-04 17:52 ` Dmitry V. Levin 2010-12-04 21:28 ` Alexey Tourbin 2010-12-04 23:26 ` Dmitry V. Levin 2010-12-04 23:41 ` Alexey Tourbin 2010-12-05 0:03 ` Dmitry V. Levin 2010-12-05 0:21 ` Alexey Tourbin 2010-12-05 12:49 ` Michael Shigorin 2010-12-07 17:50 ` Dmitry V. Levin 2010-12-05 1:24 ` Alexey Tourbin 2010-12-05 11:18 ` Dmitry V. Levin 2010-12-05 12:39 ` Alexey Tourbin 2010-12-05 12:39 ` Michael Shigorin 2010-12-05 12:58 ` Alexey Tourbin 2010-12-05 15:27 ` Dmitry V. Levin
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1290722666-24606-3-git-send-email-kirill@shutemov.name \ --to=kirill@shutemov.name \ --cc=at@altlinux.ru \ --cc=devel@lists.altlinux.org \ --cc=ldv@altlinux.org \ --cc=legion@altlinux.ru \ --cc=raorn@altlinux.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
ALT Linux Team development discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \ devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru public-inbox-index devel Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git