Changeset: 1cf1ff0fc08e for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1cf1ff0fc08e
Modified Files:
        gdk/gdk_join.c
Branch: default
Log Message:

Further expanded type-expanded binsearch; shortened default version.


diffs (81 lines):

diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -105,12 +105,22 @@ joininitresults(BAT **r1p, BAT **r2p, BU
  */
 #define BINSEARCHBODY(OP)                                              \
        do {                                                            \
-               while (hi - lo > 1) {                                   \
-                       mid = (hi + lo) / 2;                            \
-                       if (rvals[rcand ? rcand[mid] - offset : mid] OP v) \
-                               hi = mid;                               \
-                       else                                            \
-                               lo = mid;                               \
+               if (rcand) {                                            \
+                       while (hi - lo > 1) {                           \
+                               mid = (hi + lo) / 2;                    \
+                               if (rvals[rcand[mid] - offset] OP v)    \
+                                       hi = mid;                       \
+                               else                                    \
+                                       lo = mid;                       \
+                       }                                               \
+               } else {                                                \
+                       while (hi - lo > 1) {                           \
+                               mid = (hi + lo) / 2;                    \
+                               if (rvals[mid] OP v)                    \
+                                       hi = mid;                       \
+                               else                                    \
+                                       lo = mid;                       \
+                       }                                               \
                }                                                       \
        } while (0)
 
@@ -223,11 +233,14 @@ binsearch(const oid *rcand, oid offset,
        if ((c = ordering * cmp(VALUE(r, rcand ? rcand[hi] - offset : hi), v)) 
< 0 ||
            (last && c == 0))
                return hi + 1;
-/* the two versions here are equivalent, the first is disabled because
- * it does more work in the inner loop */
-#if 0
+
        /* loop invariant:
-        * last ? value@lo <= v < value@hi : value@lo < v <= value@hi */
+        * last ? value@lo <= v < value@hi : value@lo < v <= value@hi
+        *
+        * This version does some more work in the inner loop than the
+        * type-expanded versions (ordering and rcand checks) but is
+        * slow due to the function call and the needed check for
+        * rvars (in VALUE()) already, so we're beyond caring. */
        while (hi - lo > 1) {
                mid = (hi + lo) / 2;
                if ((c = ordering * cmp(VALUE(r, rcand ? rcand[mid] - offset : 
mid), v)) > 0 ||
@@ -236,29 +249,6 @@ binsearch(const oid *rcand, oid offset,
                else
                        lo = mid;
        }
-#else
-       if (last) {
-               /* loop invariant:
-                * value@lo <= v < value@hi */
-               while (hi - lo > 1) {
-                       mid = (hi + lo) / 2;
-                       if (ordering * cmp(VALUE(r, rcand ? rcand[mid] - offset 
: mid), v) > 0)
-                               hi = mid;
-                       else
-                               lo = mid;
-               }
-       } else {
-               /* loop invariant:
-                * value@lo < v <= value@hi */
-               while (hi - lo > 1) {
-                       mid = (hi + lo) / 2;
-                       if (ordering * cmp(VALUE(r, rcand ? rcand[mid] - offset 
: mid), v) >= 0)
-                               hi = mid;
-                       else
-                               lo = mid;
-               }
-       }
-#endif
        return hi;
 }
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to