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