Changeset: 394775d7cb4e for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=394775d7cb4e Modified Files: sql/storage/bat/bat_storage.c Branch: default Log Message:
optimized segments2cands diffs (73 lines): diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c --- a/sql/storage/bat/bat_storage.c +++ b/sql/storage/bat/bat_storage.c @@ -2985,10 +2985,12 @@ static BAT * segments2cands(segment *s, sql_trans *tr, size_t start, size_t end) { size_t nr = end - start, pos = 0; + int cur = 0; BAT *b = COLnew(0, TYPE_msk, nr, TRANSIENT), *bn = NULL; if (!b) return NULL; + int *dst = Tloc(b, 0); for( ; s; s=s->next) { if (s->end < start) continue; @@ -3002,15 +3004,50 @@ segments2cands(segment *s, sql_trans *tr lnr -= (start - s->start); if (s->end > end) lnr -= s->end - end; - /* later optimize per 32 bits */ - for(size_t i = 0; i<lnr; i++) { - if (BUNappend(b, (ptr) &m, true) != GDK_SUCCEED) { - BBPreclaim(b); - return NULL; + + if (m) { + size_t used = pos&31, end = 32; + if (used) { + if (lnr < (32-used)) + end = used + lnr; + for(size_t j=used; j < end; j++, pos++, lnr--) + cur |= 1U<<j; + if (end == 32) { + *dst++ = cur; + cur = 0; + } } + size_t full = lnr/32; + size_t rest = lnr%32; + for(size_t i = 0; i<full; i++, pos+=32, lnr-=32) + *dst++ = ~0; + for(size_t j=0; j < rest; j++, pos++, lnr--) + cur |= 1U<<j; + assert(lnr==0); + } else { + size_t used = pos&31, end = 32; + if (used) { + if (lnr < (32-used)) + end = used + lnr; + + pos+= (end-used); + lnr-= (end-used); + if (end == 32) { + *dst++ = cur; + cur = 0; + } + } + size_t full = lnr/32; + size_t rest = lnr%32; + for(size_t i = 0; i<full; i++, pos+=32, lnr-=32) + *dst++ = 0; + pos+= rest; + lnr-= rest; + assert(lnr==0); } - pos += lnr; } + *dst=cur; + BATsetcount(b, nr); if (!(bn = BATmaskedcands(start, nr, b, true))) { BBPreclaim(b); return NULL; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list