Changeset: 6622dccff56c for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6622dccff56c Modified Files: gdk/gdk_batop.c Branch: default Log Message:
Switch on trivial types for BATordered and BATordered_rev checks diffs (216 lines): diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c --- a/gdk/gdk_batop.c +++ b/gdk/gdk_batop.c @@ -1774,6 +1774,38 @@ BATkeyed(BAT *b) return b->tkey; } +#define BAT_ORDERED(TPE) \ + do { \ + const TPE *restrict vals = Tloc(b, 0); \ + for (BUN q = BUNlast(b), p = 1; p < q; p++) { \ + if (vals[p - 1] > vals[p]) { \ + b->tnosorted = p; \ + TRC_DEBUG(ALGO, "Fixed nosorted(" BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p, BATgetId(b), BATcount(b), GDKusec() - t0); \ + goto doreturn; \ + } else if (!b->trevsorted && b->tnorevsorted == 0 && vals[p - 1] < vals[p]) { \ + b->tnorevsorted = p; \ + TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for %s#" BUNFMT "\n", p, BATgetId(b), BATcount(b)); \ + } \ + } \ + } while (0) + +#define BAT_ORDERED_FP(TPE) \ + do { \ + const TPE *restrict vals = Tloc(b, 0); \ + for (BUN q = BUNlast(b), p = 1; p < q; p++) { \ + TPE prev = vals[p - 1], next = vals[p]; \ + int cmp = is_flt_nil(prev) ? -!is_flt_nil(next) : is_flt_nil(next) ? 1 : (prev > next) - (prev < next); \ + if (cmp > 0) { \ + b->tnosorted = p; \ + TRC_DEBUG(ALGO, "Fixed nosorted(" BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p, BATgetId(b), BATcount(b), GDKusec() - t0); \ + goto doreturn; \ + } else if (!b->trevsorted && b->tnorevsorted == 0 && cmp < 0) { \ + b->tnorevsorted = p; \ + TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for %s#" BUNFMT "\n", p, BATgetId(b), BATcount(b)); \ + } \ + } \ + } while (0) + /* Return whether the BAT is ordered or not. If we don't know, invest * in a scan and record the results in the bat descriptor. If during * the scan we happen to find evidence that the BAT is not reverse @@ -1795,58 +1827,47 @@ BATordered(BAT *b) * there, and not so likely to be used at the same time. */ MT_lock_set(&b->batIdxLock); if (!b->tsorted && b->tnosorted == 0) { - BATiter bi = bat_iterator(b); - int (*cmpf)(const void *, const void *) = ATOMcompare(b->ttype); - BUN p, q; b->batDirtydesc = true; switch (ATOMbasetype(b->ttype)) { - case TYPE_int: { - const int *iptr = (const int *) Tloc(b, 0); - for (q = BUNlast(b), p = 1; p < q; p++) { - if (iptr[p - 1] > iptr[p]) { + case TYPE_bte: + BAT_ORDERED(bte); + break; + case TYPE_sht: + BAT_ORDERED(sht); + break; + case TYPE_int: + BAT_ORDERED(int); + break; + case TYPE_lng: + BAT_ORDERED(lng); + break; +#ifdef HAVE_HGE + case TYPE_hge: + BAT_ORDERED(hge); + break; +#endif + case TYPE_flt: + BAT_ORDERED_FP(flt); + break; + case TYPE_dbl: + BAT_ORDERED_FP(dbl); + break; + default: { + BATiter bi = bat_iterator(b); + int (*cmpf)(const void *, const void *) = ATOMcompare(b->ttype); + for (BUN q = BUNlast(b), p = 1; p < q; p++) { + int c; + if ((c = cmpf(BUNtail(bi, p - 1), BUNtail(bi, p))) > 0) { b->tnosorted = p; TRC_DEBUG(ALGO, "Fixed nosorted(" BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p, BATgetId(b), BATcount(b), GDKusec() - t0); goto doreturn; - } else if (!b->trevsorted && - b->tnorevsorted == 0 && - iptr[p - 1] < iptr[p]) { + } else if (!b->trevsorted && b->tnorevsorted == 0 && c < 0) { b->tnorevsorted = p; TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for %s#" BUNFMT "\n", p, BATgetId(b), BATcount(b)); } } break; } - case TYPE_lng: { - const lng *lptr = (const lng *) Tloc(b, 0); - for (q = BUNlast(b), p = 1; p < q; p++) { - if (lptr[p - 1] > lptr[p]) { - b->tnosorted = p; - TRC_DEBUG(ALGO, "Fixed nosorted(" BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p, BATgetId(b), BATcount(b), GDKusec() - t0); - goto doreturn; - } else if (!b->trevsorted && - b->tnorevsorted == 0 && - lptr[p - 1] < lptr[p]) { - b->tnorevsorted = p; - TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for %s#" BUNFMT "\n", p, BATgetId(b), BATcount(b)); - } - } - break; - } - default: - for (q = BUNlast(b), p = 1; p < q; p++) { - int c; - if ((c = cmpf(BUNtail(bi, p - 1), BUNtail(bi, p))) > 0) { - b->tnosorted = p; - TRC_DEBUG(ALGO, "Fixed nosorted(" BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p, BATgetId(b), BATcount(b), GDKusec() - t0); - goto doreturn; - } else if (!b->trevsorted && - b->tnorevsorted == 0 && - c < 0) { - b->tnorevsorted = p; - TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for %s#" BUNFMT "\n", p, BATgetId(b), BATcount(b)); - } - } - break; } /* we only get here if we completed the scan; note * that if we didn't record evidence about *reverse* @@ -1864,6 +1885,32 @@ BATordered(BAT *b) return b->tsorted; } +#define BAT_REVORDERED(TPE) \ + do { \ + const TPE *restrict vals = Tloc(b, 0); \ + for (BUN q = BUNlast(b), p = 1; p < q; p++) { \ + if (vals[p - 1] < vals[p]) { \ + b->tnorevsorted = p; \ + TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p, BATgetId(b), BATcount(b), GDKusec() - t0); \ + goto doreturn; \ + } \ + } \ + } while (0) + +#define BAT_REVORDERED_FP(TPE) \ + do { \ + const TPE *restrict vals = Tloc(b, 0); \ + for (BUN q = BUNlast(b), p = 1; p < q; p++) { \ + TPE prev = vals[p - 1], next = vals[p]; \ + int cmp = is_flt_nil(prev) ? -!is_flt_nil(next) : is_flt_nil(next) ? 1 : (prev > next) - (prev < next); \ + if (cmp < 0) { \ + b->tnorevsorted = p; \ + TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p, BATgetId(b), BATcount(b), GDKusec() - t0); \ + goto doreturn; \ + } \ + } \ + } while (0) + /* Return whether the BAT is reverse ordered or not. If we don't * know, invest in a scan and record the results in the bat * descriptor. */ @@ -1882,16 +1929,43 @@ BATordered_rev(BAT *b) return false; MT_lock_set(&b->batIdxLock); if (!b->trevsorted && b->tnorevsorted == 0) { - BATiter bi = bat_iterator(b); - int (*cmpf)(const void *, const void *) = ATOMcompare(b->ttype); - BUN p, q; b->batDirtydesc = true; - for (q = BUNlast(b), p = 1; p < q; p++) { - if (cmpf(BUNtail(bi, p - 1), BUNtail(bi, p)) < 0) { - b->tnorevsorted = p; - TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p, BATgetId(b), BATcount(b), GDKusec() - t0); - goto doreturn; + switch (ATOMbasetype(b->ttype)) { + case TYPE_bte: + BAT_REVORDERED(bte); + break; + case TYPE_sht: + BAT_REVORDERED(sht); + break; + case TYPE_int: + BAT_REVORDERED(int); + break; + case TYPE_lng: + BAT_REVORDERED(lng); + break; +#ifdef HAVE_HGE + case TYPE_hge: + BAT_REVORDERED(hge); + break; +#endif + case TYPE_flt: + BAT_REVORDERED_FP(flt); + break; + case TYPE_dbl: + BAT_REVORDERED_FP(dbl); + break; + default: { + BATiter bi = bat_iterator(b); + int (*cmpf)(const void *, const void *) = ATOMcompare(b->ttype); + for (BUN q = BUNlast(b), p = 1; p < q; p++) { + if (cmpf(BUNtail(bi, p - 1), BUNtail(bi, p)) < 0) { + b->tnorevsorted = p; + TRC_DEBUG(ALGO, "Fixed norevsorted(" BUNFMT ") for %s#" BUNFMT " (" LLFMT " usec)\n", p, BATgetId(b), BATcount(b), GDKusec() - t0); + goto doreturn; + } } + break; + } } b->trevsorted = true; TRC_DEBUG(ALGO, "Fixed revsorted for %s#" BUNFMT " (" LLFMT " usec)\n", BATgetId(b), BATcount(b), GDKusec() - t0); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list