1 #include "XMLDocShredder.h"
12 static double tFirstChild = 0;
13 static double tNextSibling = 0;
14 static double tParent = 0;
15 static double tTaggedAncestor = 0;
16 static double tTaggedChild = 0;
17 static double tTaggedDesc = 0;
18 static double tTaggedFoll = 0;
19 static double tParentNode = 0;
20 static double tPrevNode = 0;
21 static double tTag = 0;
22 static double tMyText = 0;
23 static double tPrevText = 0;
24 static double tNextText = 0;
25 static double tDocIds = 0;
27 static double tFullTraversal = 0;
28 static double tJumpTraversal = 0;
30 static unsigned int cFirstChild = 0;
31 static unsigned int cNextSibling = 0;
32 static unsigned int cParent = 0;
33 static unsigned int cTaggedAncestor = 0;
34 static unsigned int cTaggedChild = 0;
35 static unsigned int cTaggedDesc = 0;
36 static unsigned int cTaggedFoll = 0;
37 static unsigned int cParentNode = 0;
38 static unsigned int cPrevNode = 0;
39 static unsigned int cTag = 0;
40 static unsigned int cMyText = 0;
41 static unsigned int cPrevText = 0;
42 static unsigned int cNextText = 0;
43 static unsigned int cDocIds = 0;
45 static unsigned int cFullTraversal = 0;
46 static unsigned int cJumpTraversal = 0;
49 static struct timeval tmpv1;
50 static struct timeval tmpv2;
52 static TagType target_tag = -1;
54 #define STARTTIMER() (gettimeofday(&tmpv1,NULL))
55 #define STOPTIMER(x) do { \
56 gettimeofday(&tmpv2,NULL); \
57 (t##x) = (t##x) + ((tmpv2.tv_sec - tmpv1.tv_sec) * 1000000.0 + \
58 (tmpv2.tv_usec - tmpv1.tv_usec))/1000.0; \
62 #define PRINTSTATS(x) do { \
63 std::cout.width(15); \
64 std::cout << std::left << #x; \
67 std::cout << std::right << c##x << " calls, "; \
69 std::cout << std::right << (t##x) \
72 std::cout << std::right \
73 << (t##x) *1.00 / c##x \
77 void traversal(XMLTree * tree, treeNode node,unsigned char* targettagname){
82 const unsigned char * tagname;
86 tag = tree->Tag(node);
88 if (target_tag == -1){
89 tagname = tree->GetTagNameByRef(tag);
90 if (strcmp( (char*) tagname, (char*) targettagname) == 0)
94 res1 = tree->Parent(node);
98 res1 = tree->TaggedChild(node,0,tag);
99 STOPTIMER(TaggedChild);
102 res1 = tree->TaggedAncestor(node,tag);
103 STOPTIMER(TaggedAncestor);
106 res1 = tree->TaggedDesc(node,tag);
107 STOPTIMER(TaggedDesc);
110 res1 = tree->TaggedFoll(node,tag);
111 STOPTIMER(TaggedFoll);
114 rg = tree->DocIds(node);
118 id1 = tree->MyText(node);
122 id2 = tree->PrevText(node);
126 id3 = tree->NextText(node);
129 id1 = max(id1, max(id2,id3));
132 res1 = tree->ParentNode(id1);
133 STOPTIMER(ParentNode);
136 res1 = tree->PrevNode(id1);
140 res1 = tree->FirstChild(node);
141 STOPTIMER(FirstChild);
144 res2 = tree->NextSibling(node);
145 STOPTIMER(NextSibling);
147 traversal(tree,res1,targettagname);
148 traversal(tree,res2,targettagname);
154 /* This simulates the run function of the automata */
156 unsigned int time_traversal(XMLTree *tree,treeNode node){
160 tag = tree->Tag(node);
161 if (tag == target_tag)
163 time_traversal(tree,tree->FirstChild(node)) +
164 time_traversal(tree,tree->NextSibling(node));
166 return time_traversal(tree,tree->FirstChild(node)) +
167 time_traversal(tree,tree->NextSibling(node));
174 /* This simulates the run function of the jumping automata*/
175 unsigned int time_jump(XMLTree* tree, treeNode node,treeNode root){
179 tag = tree->Tag(node);
180 if (tag == target_tag)
182 time_jump(tree, tree->TaggedDesc(node,target_tag),node) +
183 time_jump(tree, tree->TaggedFollBelow(node,target_tag,root), root);
186 return time_jump(tree, tree->TaggedDesc(node,target_tag),node) +
187 time_jump(tree, tree->TaggedFollBelow(node,target_tag,root), root);
197 int main(int argc, char ** argv){
198 unsigned int count1,count2;
199 unsigned char * tagname = (unsigned char *) "keyword";
202 std::cout << "Usage : " << argv[0] << " filename (without .srx)\n";
206 // The samplerate is not taken into account for loading anymore
207 XMLTree * tree = XMLTree::Load((unsigned char*) argv[1],64);
209 traversal(tree,tree->Root(),tagname);
212 count1 = time_traversal(tree,tree->Root());
213 STOPTIMER(FullTraversal);
215 count2 = time_jump(tree,tree->Root(),tree->Root());
216 STOPTIMER(JumpTraversal);
219 PRINTSTATS(FirstChild);
220 PRINTSTATS(NextSibling);
222 PRINTSTATS(TaggedAncestor);
223 PRINTSTATS(TaggedChild);
225 PRINTSTATS(TaggedDesc);
226 PRINTSTATS(TaggedFoll);
227 PRINTSTATS(PrevText);
229 PRINTSTATS(NextText);
230 PRINTSTATS(ParentNode);
231 PRINTSTATS(PrevNode);
233 std::cout << "Full traversal found " << count1 << " " << tagname << " nodes\n";
234 PRINTSTATS(FullTraversal);
236 std::cout << "Jump traversal found " << count2 << " " << tagname << " nodes\n";
237 PRINTSTATS(JumpTraversal);