/xmlbench/trunk

To get this branch, use:
bzr branch http://darksoft.org/webbzr/xmlbench/trunk
2 by Suren A. Chilingaryan
Intel, Tango, Phobos, and RapidXML parsers; Memory benchmark scripts
1
module tango_dom;
2
3
import tango.io.Stdout;
4
import tango.text.xml.PullParser;
9 by Suren A. Chilingaryan
Implement DOM walking mode for parsing benchmark in fast parsers
5
import Float = tango.text.convert.Float;
2 by Suren A. Chilingaryan
Intel, Tango, Phobos, and RapidXML parsers; Memory benchmark scripts
6
7
import tools;
8
9
char types[][] = ["Done", "StartElement", "Attribute", "EndElement", "EndEmptyElement", "Data", "Comment", "CData", "Doctype", "PI", "None"];
10
extern(C) void initXML(TestData *td) {
11
}
12
13
extern(C) void releaseXML(TestData *td) {
14
}
15
16
9 by Suren A. Chilingaryan
Implement DOM walking mode for parsing benchmark in fast parsers
17
void walkXML(TestData *td, uint iter) {
18
    double res_total = 0;
19
    double res_attr[MAX_LEVELS+1];
20
    double res_sum[MAX_LEVELS+1];
21
    int res_count[MAX_LEVELS+1];
22
    int level = 0;
23
    res_count[0] = 0;
24
25
    XmlTokenType type;
26
    auto parser = new PullParser!(char) (td.xml[0..td.xmllen]);
27
    do {
28
	type = parser.next;
29
	switch(type) {
30
	    case XmlTokenType.StartElement:
31
		res_attr[level] = 0;
32
		if (++level == MAX_LEVELS) {
13 by Suren A. Chilingaryan
LibXML Pull Parser, FAXPP Parser, Mono security benchmark, multiple fixes
33
		    Stdout.formatln("XML structure is too deep, only {} levels are supported\n", MAX_LEVELS);
9 by Suren A. Chilingaryan
Implement DOM walking mode for parsing benchmark in fast parsers
34
		    throw new Exception("XML structure is too deep");
35
		}
36
		res_count[level]=0;
37
	    break;
38
	    case XmlTokenType.Attribute:
39
		if ((!res_attr[level-1])&&(parser.value)) {
40
		    try {
41
			double res = Float.toFloat(parser.value);
42
			if (res) res_attr[level-1] = res;
43
		    } catch {
44
		    }
45
		}
46
	    break;
47
	    case XmlTokenType.EndElement:
13 by Suren A. Chilingaryan
LibXML Pull Parser, FAXPP Parser, Mono security benchmark, multiple fixes
48
	    case XmlTokenType.EndEmptyElement:
9 by Suren A. Chilingaryan
Implement DOM walking mode for parsing benchmark in fast parsers
49
		if (res_count[level] > 3) {
50
		    res_total += res_sum[level];
51
		}
52
	        --level;
53
		if (res_count[level]) {
54
		    res_sum[level]+=res_attr[level];
55
	        } else {
56
		    res_sum[level]=res_attr[level];
57
		}
58
		++res_count[level];
59
	    break;
60
	    case XmlTokenType.Data:
61
		if (parser.value) {
62
		    try {
63
			double res = Float.toFloat(parser.value);
64
			if (res) res_attr[level-1] = res;
65
		    } catch {
66
		    }
67
		}
68
	    break;
69
	    default:
70
	}
71
    } while (type);
72
73
//    Stdout.formatln("Sum {}", res_total);
74
75
}
76
5 by Suren A. Chilingaryan
DOM Creation benchmark for mono and tango
77
extern(C) void parseXML(TestData *td, uint iter) {
2 by Suren A. Chilingaryan
Intel, Tango, Phobos, and RapidXML parsers; Memory benchmark scripts
78
    XmlTokenType type;
9 by Suren A. Chilingaryan
Implement DOM walking mode for parsing benchmark in fast parsers
79
    if (get_walk_mode()) {
80
	return walkXML(td, iter);
81
    }
82
2 by Suren A. Chilingaryan
Intel, Tango, Phobos, and RapidXML parsers; Memory benchmark scripts
83
    auto parser = new PullParser!(char) (td.xml[0..td.xmllen]);
84
    do {
85
	type = parser.next;
86
//	Stdout.format("{}: {} {}\n", types[type], parser.name, parser.value);
87
    } while (type);
88
89
}
90
91
void main(char[][] args)
92
{
93
    DTest(args);
94
}