Changeset: 6789001041c3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6789001041c3
Modified Files:
        gdk/gdk_calc.c
Branch: default
Log Message:

Optimizing one side constant versions


diffs (233 lines):

diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -1422,20 +1422,31 @@ BATcalcmin_no_nil(BAT *b1, BAT *b2, BAT 
        return NULL;
 }
 
+#define MINMAX_CST_TYPE(TYPE, OP)      \
+       do {                                                            \
+               TYPE *restrict tb = Tloc(b, 0), *restrict tbn = Tloc(bn, 0), 
pp2 = *(TYPE*) p2; \
+               for (BUN i = 0; i < ncand; i++) {       \
+                       oid x = canditer_next(&ci) - b->hseqbase;       \
+                       TYPE p1 = tb[x]; \
+                       if (is_##TYPE##_nil(p1)) {      \
+                               nils++; \
+                               tbn[i] = TYPE##_nil; \
+                       } else {        \
+                               tbn[i] = p1 OP pp2 ? p1 : pp2; \
+                       } \
+               }       \
+       } while (0)
+
 BAT *
 BATcalcmincst(BAT *b, const ValRecord *v, BAT *s)
 {
        lng t0 = 0;
        BAT *bn;
-       BUN nils = 0;
-       BUN ncand;
-       BUN i;
+       BUN nils = 0, ncand;
        struct canditer ci;
-       oid x;
-       const void *restrict nil;
-       const void *p1, *p2;
-       BATiter bi;
-       int (*cmp)(const void *, const void *);
+       const void *p2;
+       const void *restrict nil = ATOMnilptr(b->ttype);
+       int (*cmp)(const void *, const void *) = ATOMcompare(b->ttype);
 
        TRC_DEBUG_IF(ALGO) t0 = GDKusec();
 
@@ -1445,38 +1456,62 @@ BATcalcmincst(BAT *b, const ValRecord *v
                return NULL;
        }
 
-       nil = ATOMnilptr(b->ttype);
        ncand = canditer_init(&ci, b, s);
-
-       nil = ATOMnilptr(b->ttype);
-       cmp = ATOMcompare(b->ttype);
        p2 = VALptr(v);
        if (ncand == 0 ||
-           cmp(p2, nil) == 0 ||
-           (b->ttype == TYPE_void && is_oid_nil(b->tseqbase)))
+               cmp(p2, nil) == 0 ||
+               (b->ttype == TYPE_void && is_oid_nil(b->tseqbase)))
                return BATconstantV(ci.hseq, b->ttype, nil, ncand, TRANSIENT);
 
        bn = COLnew(ci.hseq, ATOMtype(b->ttype), ncand, TRANSIENT);
        if (bn == NULL)
                return NULL;
-       bi = bat_iterator(b);
-
-       for (i = 0; i < ci.ncand; i++) {
-               x = canditer_next(&ci) - b->hseqbase;
-               p1 = BUNtail(bi, x);
-               if (cmp(p1, nil) == 0) {
-                       nils++;
-                       p1 = nil;
-               } else if (cmp(p1, p2) > 0) {
-                       p1 = p2;
-               }
-               if (bunfastapp(bn, p1) != GDK_SUCCEED)
-                       goto bunins_failed;
-       }
-
-       bn->theap->dirty = true;
+
+       switch (ATOMbasetype(b->ttype)) {
+       case TYPE_bte:
+               MINMAX_CST_TYPE(bte, <);
+               break;
+       case TYPE_sht:
+               MINMAX_CST_TYPE(sht, <);
+               break;
+       case TYPE_int:
+               MINMAX_CST_TYPE(int, <);
+               break;
+       case TYPE_lng:
+               MINMAX_CST_TYPE(lng, <);
+               break;
+#ifdef HAVE_HGE
+       case TYPE_hge:
+               MINMAX_CST_TYPE(hge, <);
+               break;
+#endif
+       case TYPE_flt:
+               MINMAX_CST_TYPE(flt, <);
+               break;
+       case TYPE_dbl:
+               MINMAX_CST_TYPE(dbl, <);
+               break;
+       default: {
+               BATiter bi = bat_iterator(b);
+
+               for (BUN i = 0; i < ncand; i++) {
+                       oid x = canditer_next(&ci) - b->hseqbase;
+                       const void *p1 = BUNtail(bi, x);
+                       if (cmp(p1, nil) == 0) {
+                               nils++;
+                               p1 = nil;
+                       } else {
+                               p1 = cmp(p1, p2) < 0 ? p1 : p2;
+                       }
+                       if (bunfastapp(bn, p1) != GDK_SUCCEED)
+                               goto bunins_failed;
+               }
+       }
+       }
+
        bn->tnil = nils > 0;
        bn->tnonil = nils == 0;
+       BATsetcount(bn, ncand);
        if (ncand <= 1) {
                bn->tsorted = true;
                bn->trevsorted = true;
@@ -1812,15 +1847,11 @@ BATcalcmaxcst(BAT *b, const ValRecord *v
 {
        lng t0 = 0;
        BAT *bn;
-       BUN nils = 0;
-       BUN ncand;
-       BUN i;
+       BUN nils = 0, ncand;
        struct canditer ci;
-       oid x;
-       const void *restrict nil;
-       const void *p1, *p2;
-       BATiter bi;
-       int (*cmp)(const void *, const void *);
+       const void *p2;
+       const void *restrict nil = ATOMnilptr(b->ttype);
+       int (*cmp)(const void *, const void *) = ATOMcompare(b->ttype);
 
        TRC_DEBUG_IF(ALGO) t0 = GDKusec();
 
@@ -1830,38 +1861,62 @@ BATcalcmaxcst(BAT *b, const ValRecord *v
                return NULL;
        }
 
-       nil = ATOMnilptr(b->ttype);
        ncand = canditer_init(&ci, b, s);
-
-       nil = ATOMnilptr(b->ttype);
-       cmp = ATOMcompare(b->ttype);
        p2 = VALptr(v);
        if (ncand == 0 ||
-           cmp(p2, nil) == 0 ||
-           (b->ttype == TYPE_void && is_oid_nil(b->tseqbase)))
+               cmp(p2, nil) == 0 ||
+               (b->ttype == TYPE_void && is_oid_nil(b->tseqbase)))
                return BATconstantV(ci.hseq, b->ttype, nil, ncand, TRANSIENT);
 
        bn = COLnew(ci.hseq, ATOMtype(b->ttype), ncand, TRANSIENT);
        if (bn == NULL)
                return NULL;
-       bi = bat_iterator(b);
-
-       for (i = 0; i < ci.ncand; i++) {
-               x = canditer_next(&ci) - b->hseqbase;
-               p1 = BUNtail(bi, x);
-               if (cmp(p1, nil) == 0) {
-                       nils++;
-                       p1 = nil;
-               } else if (cmp(p1, p2) < 0) {
-                       p1 = p2;
-               }
-               if (bunfastapp(bn, p1) != GDK_SUCCEED)
-                       goto bunins_failed;
-       }
-
-       bn->theap->dirty = true;
+
+       switch (ATOMbasetype(b->ttype)) {
+       case TYPE_bte:
+               MINMAX_CST_TYPE(bte, >);
+               break;
+       case TYPE_sht:
+               MINMAX_CST_TYPE(sht, >);
+               break;
+       case TYPE_int:
+               MINMAX_CST_TYPE(int, >);
+               break;
+       case TYPE_lng:
+               MINMAX_CST_TYPE(lng, >);
+               break;
+#ifdef HAVE_HGE
+       case TYPE_hge:
+               MINMAX_CST_TYPE(hge, >);
+               break;
+#endif
+       case TYPE_flt:
+               MINMAX_CST_TYPE(flt, >);
+               break;
+       case TYPE_dbl:
+               MINMAX_CST_TYPE(dbl, >);
+               break;
+       default: {
+               BATiter bi = bat_iterator(b);
+
+               for (BUN i = 0; i < ncand; i++) {
+                       oid x = canditer_next(&ci) - b->hseqbase;
+                       const void *p1 = BUNtail(bi, x);
+                       if (cmp(p1, nil) == 0) {
+                               nils++;
+                               p1 = nil;
+                       } else {
+                               p1 = cmp(p1, p2) > 0 ? p1 : p2;
+                       }
+                       if (bunfastapp(bn, p1) != GDK_SUCCEED)
+                               goto bunins_failed;
+               }
+       }
+       }
+
        bn->tnil = nils > 0;
        bn->tnonil = nils == 0;
+       BATsetcount(bn, ncand);
        if (ncand <= 1) {
                bn->tsorted = true;
                bn->trevsorted = true;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to