Update of /cvsroot/monetdb/pathfinder/runtime
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv853

Modified Files:
      Tag: xquery-decomposition
        rt_projection.mx xrpc_server.mx 
Log Message:
replace BUNappend with direct access into the tails, speedy up c.a. 30%


Index: xrpc_server.mx
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/runtime/xrpc_server.mx,v
retrieving revision 1.58.2.10
retrieving revision 1.58.2.11
diff -u -d -r1.58.2.10 -r1.58.2.11
--- xrpc_server.mx      12 Mar 2008 02:28:41 -0000      1.58.2.10
+++ xrpc_server.mx      12 Mar 2008 18:21:26 -0000      1.58.2.11
@@ -693,7 +693,7 @@
 {
     bit isSimpleParam = 1;
     lng argc = 0, iterc = 0, nr_args = 0;
-    lng **argcnt;
+    lng **argcnt = NULL;
     lng i = 0, j = 0, k = 0, max_args = 0;
     str *argtpe = NULL, *argval = NULL;
     char *arity_str = NULL, *itercnt_str = NULL;

Index: rt_projection.mx
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/runtime/Attic/rt_projection.mx,v
retrieving revision 1.1.2.16
retrieving revision 1.1.2.17
diff -u -d -r1.1.2.16 -r1.1.2.17
--- rt_projection.mx    12 Mar 2008 02:28:41 -0000      1.1.2.16
+++ rt_projection.mx    12 Mar 2008 18:21:25 -0000      1.1.2.17
@@ -645,6 +645,41 @@
     return ctx;
 }
 
+#define extend_bats(maxsize, res,\
+        newsizeT, newlevelT, newpropT, newkindT, newnidT) { \
+    BATsetcount(res[0], maxsize); \
+    BATsetcount(res[1], maxsize); \
+    BATsetcount(res[2], maxsize); \
+    BATsetcount(res[3], maxsize); \
+    BATsetcount(res[4], maxsize); \
+    maxsize *= 2; \
+    BAT *b0 = BATextend(res[0], maxsize); \
+    BAT *b1 = BATextend(res[1], maxsize); \
+    BAT *b2 = BATextend(res[2], maxsize); \
+    BAT *b3 = BATextend(res[3], maxsize); \
+    BAT *b4 = BATextend(res[4], maxsize); \
+    if(!b0 || !b1 || !b2 || !b3 || !b4) { \
+        GDKerror("getProjectedNodes: append to res[0] failed\n"); \
+        if(b0) res[0] = b0; \
+        if(b1) res[1] = b1; \
+        if(b2) res[2] = b2; \
+        if(b3) res[3] = b3; \
+        if(b4) res[4] = b4; \
+        goto getpnodes_failed; \
+    } \
+    res[0] = b0; \
+    res[1] = b1; \
+    res[2] = b2; \
+    res[3] = b3; \
+    res[4] = b4; \
+    /* pointers might have been changed */ \
+    newsizeT = (int*) Tloc(res[0], BUNfirst(res[0])); \
+    newlevelT = (char*) Tloc(res[1], BUNfirst(res[1])); \
+    newpropT = (oid*) Tloc(res[2], BUNfirst(res[2])); \
+    newkindT = (char*) Tloc(res[3], BUNfirst(res[3])); \
+    newnidT = (oid*) Tloc(res[4], BUNfirst(res[4])); \
+}
+
 static BAT**
 getProjectedNodes(
         bit timing,
@@ -657,13 +692,17 @@
     oid *pre_prop = NULL, *pre_nid = NULL;
     unsigned int *pre_size = NULL;
     unsigned char *pre_level = NULL, *pre_kind = NULL;
-    int inc = 0, newsize = 0;
+    int inc = 0, newsize = 0, off = 0, maxsize = 0;
     stack stk;
     BAT *size_bat = NULL, *level_bat = NULL, *prop_bat = NULL;
     BAT *kind_bat = NULL, *nid_bat = NULL;
     BAT **res = NULL; /* size | level | prop | kind | nid */
     BATiter bi;
 
+    int *newsizeT = NULL;
+    char *newlevelT = NULL, *newkindT = NULL;
+    oid *newpropT = NULL, *newnidT = NULL;
+
     assert(ws && ctx && (contID >= 0));
 
     stk.pre = NULL;
@@ -699,6 +738,14 @@
         res[i]->tsorted = FALSE;
     }
 
+    /* directly point to the tails of the new BATs */
+    newsizeT = (int*) Tloc(res[0], BUNfirst(res[0]));
+    newlevelT = (char*) Tloc(res[1], BUNfirst(res[1]));
+    newpropT = (oid*) Tloc(res[2], BUNfirst(res[2]));
+    newkindT = (char*) Tloc(res[3], BUNfirst(res[3]));
+    newnidT = (oid*) Tloc(res[4], BUNfirst(res[4]));
+    maxsize = ctx->rescnt_est;
+
     if(!(stk.pre = GDKmalloc(XML_DEPTH_MAX * sizeof(oid)))) goto 
getpnodes_failed;
     if(!(stk.off = GDKmalloc(XML_DEPTH_MAX * sizeof(oid)))) goto 
getpnodes_failed;
     for(i = 0; i < XML_DEPTH_MAX; i++) stk.pre[i] = stk.off[i] = oid_nil;
@@ -728,59 +775,40 @@
             /* process nodes on stack bottom-up! */
             bi = bat_iterator(res[0]);
             for(i = 0; i < stk.depth; i++){
+                if(off == maxsize) {
+                    extend_bats(maxsize, res, newsizeT, newlevelT,
+                            newpropT, newkindT, newnidT);
+                }
+
                 if(stk.off[i] == oid_nil){ /* not written to output yet */
-                    stk.off[i] = BATcount(res[0]);
                     newsize = stk.depth - i - 1 + inc; /* nodes above me on 
stack and size of ctx->pre[cur] */
-                    if(!BUNappend(res[0], (ptr)&newsize, FALSE)){
-                        GDKerror("getProjectedNodes: append to res[0] 
failed\n");
-                        goto getpnodes_failed;
-                    }
-                    if(!BUNappend(res[1], (ptr)&pre_level[stk.pre[i]], FALSE)){
-                        GDKerror("getProjectedNodes: append to res[1] 
failed\n");
-                        goto getpnodes_failed;
-                    }
-                    if(!BUNappend(res[2], (ptr)&pre_prop[stk.pre[i]], FALSE)){
-                        GDKerror("getProjectedNodes: append to res[2] 
failed\n");
-                        goto getpnodes_failed;
-                    }
-                    if(!BUNappend(res[3], (ptr)&pre_kind[stk.pre[i]], FALSE)){
-                        GDKerror("getProjectedNodes: append to res[3] 
failed\n");
-                        goto getpnodes_failed;
-                    }
-                    if(!BUNappend(res[4], 
pre_nid?(ptr)&pre_nid[stk.pre[i]]:(ptr)&stk.pre[i], FALSE)){
-                        GDKerror("getProjectedNodes: append to res[4] 
failed\n");
-                        goto getpnodes_failed;
-                    }
+                    newsizeT[off] = newsize;
+                    newlevelT[off] = pre_level[stk.pre[i]];
+                    newpropT[off] = pre_prop[stk.pre[i]];
+                    newkindT[off] = pre_kind[stk.pre[i]];
+                    newnidT[off] = pre_nid ? pre_nid[stk.pre[i]] : stk.pre[i];
+                    stk.off[i] = off;
+                    off++;
                 } else { /* already in output, update 'size' */
                     /* newsize = current-size + nr-new-nodes-on-stack + 
size-of-context-node */
-                    newsize = *(int*)BUNtloc(bi, BUNfnd(res[0], 
&(stk.off[i]))) + k + inc;
-                    BUNreplace(res[0], (ptr)&(stk.off[i]), (ptr)&newsize, 
FALSE); 
+                    newsize = newsizeT[stk.off[i]] + k + inc;
+                    newsizeT[stk.off[i]] = newsize;
                 }
             }
 
             if(ctx->knd[cur] == USED){
+                if(off == maxsize) {
+                    extend_bats(maxsize, res, newsizeT, newlevelT,
+                            newpropT, newkindT, newnidT);
+                }
                 /* copy context node */
                 newsize = 0;
-                if(!BUNappend(res[0], (ptr)&newsize, FALSE)){
-                    GDKerror("getProjectedNodes: append to res[0] failed\n");
-                    goto getpnodes_failed;
-                }
-                if(!BUNappend(res[1], (ptr)&pre_level[pre], FALSE)){
-                    GDKerror("getProjectedNodes: append to res[1] failed\n");
-                    goto getpnodes_failed;
-                }
-                if(!BUNappend(res[2], (ptr)&pre_prop[pre], FALSE)){
-                    GDKerror("getProjectedNodes: append to res[2] failed\n");
-                    goto getpnodes_failed;
-                }
-                if(!BUNappend(res[3], (ptr)&pre_kind[pre], FALSE)){
-                    GDKerror("getProjectedNodes: append to res[3] failed\n");
-                    goto getpnodes_failed;
-                }
-                if(!BUNappend(res[4], pre_nid?(ptr)&pre_nid[pre]:(ptr)&pre, 
FALSE)){
-                    GDKerror("getProjectedNodes: append to res[4] failed\n");
-                    goto getpnodes_failed;
-                }
+                newsizeT[off] = newsize;
+                newlevelT[off] = pre_level[pre];
+                newpropT[off] = pre_prop[pre];
+                newkindT[off] = pre_kind[pre];
+                newnidT[off] = pre_nid ? pre_nid[pre] : pre;
+                off++;
                 if ( ((cur + 1) < ctx->size) &&
                      (ctx->pre[cur + 1] < (pre + pre_size[pre] + 1)) ){
                     /* next context node is in the subtree of pre (i.e.
@@ -794,30 +822,19 @@
             } else {
                 /* copy context node with all its descendants */
                 for (i = ctx->pre[cur]; i <= ctx->pre[cur] + 
pre_size[ctx->pre[cur]]; i++){
-                    if(!BUNappend(res[0], (ptr)&pre_size[i], FALSE)){
-                        GDKerror("getProjectedNodes: append to res[0] 
failed\n");
-                        goto getpnodes_failed;
-                    }
-                    if(!BUNappend(res[1], (ptr)&pre_level[i], FALSE)){
-                        GDKerror("getProjectedNodes: append to res[1] 
failed\n");
-                        goto getpnodes_failed;
-                    }
-                    if(!BUNappend(res[2], (ptr)&pre_prop[i], FALSE)){
-                        GDKerror("getProjectedNodes: append to res[2] 
failed\n");
-                        goto getpnodes_failed;
-                    }
-                    if(!BUNappend(res[3], (ptr)&pre_kind[i], FALSE)){
-                        GDKerror("getProjectedNodes: append to res[3] 
failed\n");
-                        goto getpnodes_failed;
-                    }
-                    if(!BUNappend(res[4], pre_nid?(ptr)&pre_nid[i]:(ptr)&i, 
FALSE)){
-                        GDKerror("getProjectedNodes: append to res[4] 
failed\n");
-                        goto getpnodes_failed;
+                    if(off == maxsize) {
+                        extend_bats(maxsize, res, newsizeT, newlevelT,
+                                newpropT, newkindT, newnidT);
                     }
+                    newsizeT[off] = pre_size[i];
+                    newlevelT[off] = pre_level[i];
+                    newpropT[off] = pre_prop[i];
+                    newkindT[off] = pre_kind[i];
+                    newnidT[off] = pre_nid ? pre_nid[i] : i;
+                    off++;
                 }
             }
             cur++;
-
             time_copy2Output += GDKusec() - time_copy2Output1Node;
         } else if (ctx->pre[cur] <= pre + pre_size[pre]) {
             /* next context node is in the descendants: go find it */
@@ -848,6 +865,18 @@
         }
     }
 
+    /* set some properties by hand */
+    BATsetcount(res[0], off);
+    BATsetcount(res[1], off);
+    BATsetcount(res[2], off);
+    BATsetcount(res[3], off);
+    BATsetcount(res[4], off);
+    res[0] = BATseqbase(res[0], 0);
+    res[1] = BATseqbase(res[1], 0);
+    res[2] = BATseqbase(res[2], 0);
+    res[3] = BATseqbase(res[3], 0);
+    res[4] = BATseqbase(res[4], 0);
+
     time_findNodes = GDKusec() - time_findNodes;
     if(timing){
         stream_printf(GDKout, "    time_findNodes:   %10.2f msec\n",


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-pf-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-pf-checkins

Reply via email to