Changeset: c5b71f6df59c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c5b71f6df59c
Modified Files:
        gdk/gdk_calc.c
        gdk/gdk_cand.h
        gdk/gdk_group.c
Branch: candidate-exceptions
Log Message:

Some speed improvements by adding special code for dense candidate lists.


diffs (truncated from 1009 to 300 lines):

diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -12946,19 +12946,35 @@ convert_##TYPE##_##TYPE(const TYPE *src,
        oid x = canditer_next(ci) - candoff;                            \
                                                                        \
        *reduce = false;                                                \
-       do {                                                            \
-               while (i < x) {                                         \
-                       dst[i++] = TYPE##_nil;                          \
-                       nils++;                                         \
-               }                                                       \
-               nils += is_##TYPE##_nil(src[i]);                        \
-               dst[i] = src[i];                                        \
-               i++;                                                    \
-               x = canditer_next(ci);                                  \
-               if (is_oid_nil(x))                                      \
-                       break;                                          \
-               x -= candoff;                                           \
-       } while (i < cnt);                                              \
+       if (ci->tpe == cand_dense) {                                    \
+               do {                                                    \
+                       while (i < x) {                                 \
+                               dst[i++] = TYPE##_nil;                  \
+                               nils++;                                 \
+                       }                                               \
+                       nils += is_##TYPE##_nil(src[i]);                \
+                       dst[i] = src[i];                                \
+                       i++;                                            \
+                       x = canditer_next_dense(ci);                    \
+                       if (is_oid_nil(x))                              \
+                               break;                                  \
+                       x -= candoff;                                   \
+               } while (i < cnt);                                      \
+       } else {                                                        \
+               do {                                                    \
+                       while (i < x) {                                 \
+                               dst[i++] = TYPE##_nil;                  \
+                               nils++;                                 \
+                       }                                               \
+                       nils += is_##TYPE##_nil(src[i]);                \
+                       dst[i] = src[i];                                \
+                       i++;                                            \
+                       x = canditer_next(ci);                          \
+                       if (is_oid_nil(x))                              \
+                               break;                                  \
+                       x -= candoff;                                   \
+               } while (i < cnt);                                      \
+       }                                                               \
        while (i < cnt) {                                               \
                dst[i++] = TYPE##_nil;                                  \
                nils++;                                                 \
@@ -12976,22 +12992,41 @@ convert_##TYPE1##_##TYPE2(const TYPE1 *s
        oid x = canditer_next(ci) - candoff;                            \
                                                                        \
        *reduce = false;                                                \
-       do {                                                            \
-               while (i < x) {                                         \
-                       dst[i++] = TYPE2##_nil;                         \
-                       nils++;                                         \
-               }                                                       \
-               if (is_##TYPE1##_nil(src[i])) {                         \
-                       dst[i] = TYPE2##_nil;                           \
-                       nils++;                                         \
-               } else                                                  \
-                       dst[i] = (TYPE2) src[i];                        \
-               i++;                                                    \
-               x = canditer_next(ci);                                  \
-               if (is_oid_nil(x))                                      \
-                       break;                                          \
-               x -= candoff;                                           \
-       } while (i < cnt);                                              \
+       if (ci->tpe == cand_dense) {                                    \
+               do {                                                    \
+                       while (i < x) {                                 \
+                               dst[i++] = TYPE2##_nil;                 \
+                               nils++;                                 \
+                       }                                               \
+                       if (is_##TYPE1##_nil(src[i])) {                 \
+                               dst[i] = TYPE2##_nil;                   \
+                               nils++;                                 \
+                       } else                                          \
+                               dst[i] = (TYPE2) src[i];                \
+                       i++;                                            \
+                       x = canditer_next_dense(ci);                    \
+                       if (is_oid_nil(x))                              \
+                               break;                                  \
+                       x -= candoff;                                   \
+               } while (i < cnt);                                      \
+       } else {                                                        \
+               do {                                                    \
+                       while (i < x) {                                 \
+                               dst[i++] = TYPE2##_nil;                 \
+                               nils++;                                 \
+                       }                                               \
+                       if (is_##TYPE1##_nil(src[i])) {                 \
+                               dst[i] = TYPE2##_nil;                   \
+                               nils++;                                 \
+                       } else                                          \
+                               dst[i] = (TYPE2) src[i];                \
+                       i++;                                            \
+                       x = canditer_next(ci);                          \
+                       if (is_oid_nil(x))                              \
+                               break;                                  \
+                       x -= candoff;                                   \
+               } while (i < cnt);                                      \
+       }                                                               \
        while (i < cnt) {                                               \
                dst[i++] = TYPE2##_nil;                                 \
                nils++;                                                 \
@@ -13009,22 +13044,41 @@ convert_##TYPE1##_##TYPE2(const TYPE1 *s
        oid x = canditer_next(ci) - candoff;                            \
                                                                        \
        *reduce = 8 * sizeof(TYPE1) > MANT_DIG;                         \
-       do {                                                            \
-               while (i < x) {                                         \
-                       dst[i++] = TYPE2##_nil;                         \
-                       nils++;                                         \
-               }                                                       \
-               if (is_##TYPE1##_nil(src[i])) {                         \
-                       dst[i] = TYPE2##_nil;                           \
-                       nils++;                                         \
-               } else                                                  \
-                       dst[i] = (TYPE2) src[i];                        \
-               i++;                                                    \
-               x = canditer_next(ci);                                  \
-               if (is_oid_nil(x))                                      \
-                       break;                                          \
-               x -= candoff;                                           \
-       } while (i < cnt);                                              \
+       if (ci->tpe == cand_dense) {                                    \
+               do {                                                    \
+                       while (i < x) {                                 \
+                               dst[i++] = TYPE2##_nil;                 \
+                               nils++;                                 \
+                       }                                               \
+                       if (is_##TYPE1##_nil(src[i])) {                 \
+                               dst[i] = TYPE2##_nil;                   \
+                               nils++;                                 \
+                       } else                                          \
+                               dst[i] = (TYPE2) src[i];                \
+                       i++;                                            \
+                       x = canditer_next_dense(ci);                    \
+                       if (is_oid_nil(x))                              \
+                               break;                                  \
+                       x -= candoff;                                   \
+               } while (i < cnt);                                      \
+       } else {                                                        \
+               do {                                                    \
+                       while (i < x) {                                 \
+                               dst[i++] = TYPE2##_nil;                 \
+                               nils++;                                 \
+                       }                                               \
+                       if (is_##TYPE1##_nil(src[i])) {                 \
+                               dst[i] = TYPE2##_nil;                   \
+                               nils++;                                 \
+                       } else                                          \
+                               dst[i] = (TYPE2) src[i];                \
+                       i++;                                            \
+                       x = canditer_next(ci);                          \
+                       if (is_oid_nil(x))                              \
+                               break;                                  \
+                       x -= candoff;                                   \
+               } while (i < cnt);                                      \
+       }                                                               \
        while (i < cnt) {                                               \
                dst[i++] = TYPE2##_nil;                                 \
                nils++;                                                 \
@@ -13049,29 +13103,55 @@ convert_##TYPE1##_oid(const TYPE1 *src, 
        oid x = canditer_next(ci) - candoff;                            \
                                                                        \
        *reduce = false;                                                \
-       do {                                                            \
-               while (i < x) {                                         \
-                       dst[i++] = oid_nil;                             \
-                       nils++;                                         \
-               }                                                       \
-               if (is_##TYPE1##_nil(src[i])) {                         \
-                       dst[i] = oid_nil;                               \
-                       nils++;                                         \
-               } else if (src[i] < 0) {                                \
-                       if (abort_on_error)                             \
+       if (ci->tpe == cand_dense) {                                    \
+               do {                                                    \
+                       while (i < x) {                                 \
+                               dst[i++] = oid_nil;                     \
+                               nils++;                                 \
+                       }                                               \
+                       if (is_##TYPE1##_nil(src[i])) {                 \
+                               dst[i] = oid_nil;                       \
+                               nils++;                                 \
+                       } else if (src[i] < 0) {                        \
+                               if (abort_on_error)                     \
+                                       CONV_OVERFLOW(TYPE1, "oid", src[i]); \
+                               *reduce = true;                         \
+                               dst[i] = oid_nil;                       \
+                               nils++;                                 \
+                       } else if (is_oid_nil((dst[i] = (oid) src[i])) && \
+                                  abort_on_error)                      \
                                CONV_OVERFLOW(TYPE1, "oid", src[i]);    \
-                       *reduce = true;                                 \
-                       dst[i] = oid_nil;                               \
-                       nils++;                                         \
-               } else if (is_oid_nil((dst[i] = (oid) src[i])) &&       \
-                          abort_on_error)                              \
-                       CONV_OVERFLOW(TYPE1, "oid", src[i]);            \
-               i++;                                                    \
-               x = canditer_next(ci);                                  \
-               if (is_oid_nil(x))                                      \
-                       break;                                          \
-               x -= candoff;                                           \
-       } while (i < cnt);                                              \
+                       i++;                                            \
+                       x = canditer_next_dense(ci);                    \
+                       if (is_oid_nil(x))                              \
+                               break;                                  \
+                       x -= candoff;                                   \
+               } while (i < cnt);                                      \
+       } else {                                                        \
+               do {                                                    \
+                       while (i < x) {                                 \
+                               dst[i++] = oid_nil;                     \
+                               nils++;                                 \
+                       }                                               \
+                       if (is_##TYPE1##_nil(src[i])) {                 \
+                               dst[i] = oid_nil;                       \
+                               nils++;                                 \
+                       } else if (src[i] < 0) {                        \
+                               if (abort_on_error)                     \
+                                       CONV_OVERFLOW(TYPE1, "oid", src[i]); \
+                               *reduce = true;                         \
+                               dst[i] = oid_nil;                       \
+                               nils++;                                 \
+                       } else if (is_oid_nil((dst[i] = (oid) src[i])) && \
+                                  abort_on_error)                      \
+                               CONV_OVERFLOW(TYPE1, "oid", src[i]);    \
+                       i++;                                            \
+                       x = canditer_next(ci);                          \
+                       if (is_oid_nil(x))                              \
+                               break;                                  \
+                       x -= candoff;                                   \
+               } while (i < cnt);                                      \
+       }                                                               \
        while (i < cnt) {                                               \
                dst[i++] = oid_nil;                                     \
                nils++;                                                 \
@@ -13089,30 +13169,57 @@ convert_##TYPE1##_oid(const TYPE1 *src, 
        oid x = canditer_next(ci) - candoff;                            \
                                                                        \
        *reduce = false;                                                \
-       do {                                                            \
-               while (i < x) {                                         \
-                       dst[i++] = oid_nil;                             \
-                       nils++;                                         \
-               }                                                       \
-               if (is_##TYPE1##_nil(src[i])) {                         \
-                       dst[i] = oid_nil;                               \
-                       nils++;                                         \
-               } else if (src[i] < 0 ||                                \
-                          src[i] > (TYPE1) GDK_oid_max) {              \
-                       if (abort_on_error)                             \
+       if (ci->tpe == cand_dense) {                                    \
+               do {                                                    \
+                       while (i < x) {                                 \
+                               dst[i++] = oid_nil;                     \
+                               nils++;                                 \
+                       }                                               \
+                       if (is_##TYPE1##_nil(src[i])) {                 \
+                               dst[i] = oid_nil;                       \
+                               nils++;                                 \
+                       } else if (src[i] < 0 ||                        \
+                                  src[i] > (TYPE1) GDK_oid_max) {      \
+                               if (abort_on_error)                     \
+                                       CONV_OVERFLOW(TYPE1, "oid", src[i]); \
+                               *reduce = true;                         \
+                               dst[i] = oid_nil;                       \
+                               nils++;                                 \
+                       } else if (is_oid_nil((dst[i] = (oid) src[i])) && \
+                                  abort_on_error)                      \
                                CONV_OVERFLOW(TYPE1, "oid", src[i]);    \
-                       *reduce = true;                                 \
-                       dst[i] = oid_nil;                               \
-                       nils++;                                         \
-               } else if (is_oid_nil((dst[i] = (oid) src[i])) &&       \
-                          abort_on_error)                              \
-                       CONV_OVERFLOW(TYPE1, "oid", src[i]);            \
-               i++;                                                    \
-               x = canditer_next(ci);                                  \
-               if (is_oid_nil(x))                                      \
-                       break;                                          \
-               x -= candoff;                                           \
-       } while (i < cnt);                                              \
+                       i++;                                            \
+                       x = canditer_next_dense(ci);                    \
+                       if (is_oid_nil(x))                              \
+                               break;                                  \
+                       x -= candoff;                                   \
+               } while (i < cnt);                                      \
+       } else {                                                        \
+               do {                                                    \
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to