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
