Changeset: 32c3de908c7f for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/32c3de908c7f
Modified Files:
        gdk/gdk_batop.c
        monetdb5/modules/kernel/algebra.c
Branch: analyze-fix
Log Message:

Switch on dense candidate list case, so it can help speed up analyze and other 
plans. Small identation fix


diffs (179 lines):

diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -2819,6 +2819,17 @@ BATrmprop(BAT *b, enum prop_t idx)
        MT_lock_unset(&b->theaplock);
 }
 
+#define BATcount_no_nil_fixed(TPE) \
+       do { \
+               const TPE *restrict tp = (const TPE *) p; \
+               if (ci.tpe == cand_dense) { \
+                       for (i = 0; i < n; i++) \
+                               cnt += 
!is_##TPE##_nil(tp[canditer_next_dense(&ci) - hseq]); \
+               } else { \
+                       for (i = 0; i < n; i++) \
+                               cnt += !is_##TPE##_nil(tp[canditer_next(&ci) - 
hseq]); \
+               } \
+       } while(0)
 
 /*
  * The BATcount_no_nil function counts all BUN in a BAT that have a
@@ -2853,60 +2864,75 @@ BATcount_no_nil(BAT *b, BAT *s)
                cnt = n;
                break;
        case TYPE_bte:
-               for (i = 0; i < n; i++)
-                       cnt += !is_bte_nil(((const bte *) p)[canditer_next(&ci) 
- hseq]);
+               BATcount_no_nil_fixed(bte);
                break;
        case TYPE_sht:
-               for (i = 0; i < n; i++)
-                       cnt += !is_sht_nil(((const sht *) p)[canditer_next(&ci) 
- hseq]);
+               BATcount_no_nil_fixed(sht);
                break;
        case TYPE_int:
-               for (i = 0; i < n; i++)
-                       cnt += !is_int_nil(((const int *) p)[canditer_next(&ci) 
- hseq]);
+               BATcount_no_nil_fixed(int);
                break;
        case TYPE_lng:
-               for (i = 0; i < n; i++)
-                       cnt += !is_lng_nil(((const lng *) p)[canditer_next(&ci) 
- hseq]);
+               BATcount_no_nil_fixed(lng);
                break;
 #ifdef HAVE_HGE
        case TYPE_hge:
-               for (i = 0; i < n; i++)
-                       cnt += !is_hge_nil(((const hge *) p)[canditer_next(&ci) 
- hseq]);
+               BATcount_no_nil_fixed(hge);
                break;
 #endif
        case TYPE_flt:
-               for (i = 0; i < n; i++)
-                       cnt += !is_flt_nil(((const flt *) p)[canditer_next(&ci) 
- hseq]);
+               BATcount_no_nil_fixed(flt);
                break;
        case TYPE_dbl:
-               for (i = 0; i < n; i++)
-                       cnt += !is_dbl_nil(((const dbl *) p)[canditer_next(&ci) 
- hseq]);
+               BATcount_no_nil_fixed(dbl);
                break;
        case TYPE_uuid:
-               for (i = 0; i < n; i++)
-                       cnt += !is_uuid_nil(((const uuid *) 
p)[canditer_next(&ci) - hseq]);
+               BATcount_no_nil_fixed(uuid);
                break;
        case TYPE_str:
                base = bi.vh->base;
-               switch (bi.width) {
-               case 1:
-                       for (i = 0; i < n; i++)
-                               cnt += base[(var_t) ((const unsigned char *) 
p)[canditer_next(&ci) - hseq] + GDK_VAROFFSET] != '\200';
-                       break;
-               case 2:
-                       for (i = 0; i < n; i++)
-                               cnt += base[(var_t) ((const unsigned short *) 
p)[canditer_next(&ci) - hseq] + GDK_VAROFFSET] != '\200';
-                       break;
+               if (ci.tpe == cand_dense) {
+                       switch (bi.width) {
+                       case 1:
+                               for (i = 0; i < n; i++)
+                                       cnt += base[(var_t) ((const unsigned 
char *) p)[canditer_next_dense(&ci) - hseq] + GDK_VAROFFSET] != '\200';
+                               break;
+                       case 2:
+                               for (i = 0; i < n; i++)
+                                       cnt += base[(var_t) ((const unsigned 
short *) p)[canditer_next_dense(&ci) - hseq] + GDK_VAROFFSET] != '\200';
+                               break;
 #if SIZEOF_VAR_T != SIZEOF_INT
-               case 4:
-                       for (i = 0; i < n; i++)
-                               cnt += base[(var_t) ((const unsigned int *) 
p)[canditer_next(&ci) - hseq]] != '\200';
-                       break;
+                       case 4:
+                               for (i = 0; i < n; i++)
+                                       cnt += base[(var_t) ((const unsigned 
int *) p)[canditer_next_dense(&ci) - hseq]] != '\200';
+                               break;
 #endif
-               default:
-                       for (i = 0; i < n; i++)
-                               cnt += base[((const var_t *) 
p)[canditer_next(&ci) - hseq]] != '\200';
-                       break;
+                       default:
+                               for (i = 0; i < n; i++)
+                                       cnt += base[((const var_t *) 
p)[canditer_next_dense(&ci) - hseq]] != '\200';
+                               break;
+                       }
+               } else {
+                       switch (bi.width) {
+                       case 1:
+                               for (i = 0; i < n; i++)
+                                       cnt += base[(var_t) ((const unsigned 
char *) p)[canditer_next(&ci) - hseq] + GDK_VAROFFSET] != '\200';
+                               break;
+                       case 2:
+                               for (i = 0; i < n; i++)
+                                       cnt += base[(var_t) ((const unsigned 
short *) p)[canditer_next(&ci) - hseq] + GDK_VAROFFSET] != '\200';
+                               break;
+#if SIZEOF_VAR_T != SIZEOF_INT
+                       case 4:
+                               for (i = 0; i < n; i++)
+                                       cnt += base[(var_t) ((const unsigned 
int *) p)[canditer_next(&ci) - hseq]] != '\200';
+                               break;
+#endif
+                       default:
+                               for (i = 0; i < n; i++)
+                                       cnt += base[((const var_t *) 
p)[canditer_next(&ci) - hseq]] != '\200';
+                               break;
+                       }
                }
                break;
        default:
@@ -2916,11 +2942,21 @@ BATcount_no_nil(BAT *b, BAT *s)
                        cnt = n;
                } else if (b->tvarsized) {
                        base = b->tvheap->base;
-                       for (i = 0; i < n; i++)
-                               cnt += (*cmp)(nil, base + ((const var_t *) 
p)[canditer_next(&ci) - hseq]) != 0;
+                       if (ci.tpe == cand_dense) {
+                               for (i = 0; i < n; i++)
+                                       cnt += (*cmp)(nil, base + ((const var_t 
*) p)[canditer_next_dense(&ci) - hseq]) != 0;
+                       } else {
+                               for (i = 0; i < n; i++)
+                                       cnt += (*cmp)(nil, base + ((const var_t 
*) p)[canditer_next(&ci) - hseq]) != 0;
+                       }
                } else {
-                       for (i = 0, n += i; i < n; i++)
-                               cnt += (*cmp)(BUNtloc(bi, canditer_next(&ci) - 
hseq), nil) != 0;
+                       if (ci.tpe == cand_dense) {
+                               for (i = 0, n += i; i < n; i++)
+                                       cnt += (*cmp)(BUNtloc(bi, 
canditer_next_dense(&ci) - hseq), nil) != 0;
+                       } else {
+                               for (i = 0, n += i; i < n; i++)
+                                       cnt += (*cmp)(BUNtloc(bi, 
canditer_next(&ci) - hseq), nil) != 0;
+                       }
                }
                break;
        }
diff --git a/monetdb5/modules/kernel/algebra.c 
b/monetdb5/modules/kernel/algebra.c
--- a/monetdb5/modules/kernel/algebra.c
+++ b/monetdb5/modules/kernel/algebra.c
@@ -991,13 +991,12 @@ ALGcountCND_nil(lng *result, const bat *
        }
        if (b->ttype == TYPE_msk || mask_cand(b)) {
                BATsum(result, TYPE_lng, b, s, *ignore_nils, false, false);
-       } else
-        if (*ignore_nils) {
-                       *result = (lng) BATcount_no_nil(b, s);
-        } else {
-                       struct canditer ci;
-                       *result = (lng) canditer_init(&ci, b, s);
-        }
+       } else if (*ignore_nils) {
+               *result = (lng) BATcount_no_nil(b, s);
+       } else {
+               struct canditer ci;
+               *result = (lng) canditer_init(&ci, b, s);
+       }
        if (s)
                BBPunfix(s->batCacheid);
        BBPunfix(b->batCacheid);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to