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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list