/xmlbench/trunk

To get this branch, use:
bzr branch http://darksoft.org/webbzr/xmlbench/trunk
1 by Suren A. Chilingaryan
Initial import
1
#include <stdlib.h>
2
#include <unistd.h>
3
#include <sys/types.h>
4
#include <sys/stat.h>
5
6
#include "../tools/disp2.h"
7
#include "../xmlgen/xmlgen.h"
8
#include "../xmlgen/opcgen.h"
9
10
struct TestData {
11
    unsigned long iterations;
12
    
13
    char *fn;
14
    char *xml;
15
    unsigned long xmllen;
16
    unsigned long size;
17
};
18
19
char *ReadFile(char *fn) {
20
    FILE *f;
21
    struct stat st;
22
    char *buf;
23
    
24
    f=fopen(fn,"r");
25
    if (!f) {
26
	printf("Can't open XML file!\n");
27
	exit(1);
28
    }
29
    fstat(f->_fileno,&st);
30
    buf=(char*)malloc(st.st_size+1+sizeof(unsigned long));
31
    if (!buf) {
32
	printf("Can't allocate memory!\n");
33
	exit(1);
34
    }
35
    ((unsigned long*)buf)[0]=st.st_size;
36
    fread(buf+sizeof(unsigned long),st.st_size,1,f);
37
    fclose(f);
38
    buf[st.st_size+sizeof(unsigned long)]=0;
39
    return buf;
40
}
41
42
void ReadConfig(struct TestData *td) {
43
    FILE *f;
44
    f=fopen("config","r");
45
    if (!f) {
46
	printf("Error opening config file!\n");
47
	exit(1);
48
    }
49
    fscanf(f,"%lu",&(td->iterations));
50
    fclose(f);
51
}
52
53
void parseXML(struct TestData *td, unsigned long iter);
54
void signXML(struct TestData *td, unsigned long iter);
55
void verifyXML(struct TestData *td, unsigned long iter);
56
void encryptXML(struct TestData *td, unsigned long iter);
57
void decryptXML(struct TestData *td, unsigned long iter);
58
void initXML(struct TestData *td);
59
void initXML_Security(struct TestData *td);
60
void releaseXML(struct TestData *td);
61
62
63
void Usage(char *myname) {
64
    printf("Usage:\n\t%s <iterations> [<xml file>|xmlgen|opcgen] [<size>]\n",myname);
65
    exit(0);
66
}
67
68
69
int Test(int argc, char *argv[]) {
70
    int i,j;
71
    struct timeval pre_time,post_time;
72
    struct timezone tz;
73
    unsigned long init_time,init_time2,time;
74
    double init_dtime,init_d;
75
    unsigned long parse_s;
76
    double parse_m,parse_d;
77
    unsigned char mode=0;	/* 0 - file, 1 - xmlgen, 2 - opcgen */
78
    struct TestData td;
79
    char *xmlbuf,*xsdbuf;
80
    disp ds,de;
81
2 by Suren A. Chilingaryan
Intel, Tango, Phobos, and RapidXML parsers; Memory benchmark scripts
82
    int execute_xml = 1;
83
    int execute_security = 1;
84
    
85
    if (getenv("skip_security")) {
86
	execute_security = 0;
87
	if (getenv("skip_xml")) execute_xml = 0;
88
    }
89
1 by Suren A. Chilingaryan
Initial import
90
    if ((argc<3)||(argc>4)) Usage(argv[0]);
91
92
    td.iterations = atol(argv[1]);
2 by Suren A. Chilingaryan
Intel, Tango, Phobos, and RapidXML parsers; Memory benchmark scripts
93
    if (td.iterations<0) Usage(argv[0]);
1 by Suren A. Chilingaryan
Initial import
94
    
95
    if (!strncmp(argv[2],"xmlgen",6)) mode=1;
96
    else if (!strncmp(argv[2],"opcgen",6)) mode=2;
97
    td.fn=argv[2];
98
99
    if (mode) {
100
	td.size = atol(argv[3]);
101
	if (td.size<=0) Usage(argv[0]);
102
	
103
	rnd_init();	/* Initialising Random Generator */
104
    }
105
106
    switch (mode) {
107
	case 0:
108
	    xmlbuf=ReadFile(argv[2]);
109
	    if (!xmlbuf) {
110
		fprintf(stderr,"Can't read XML file!\n");
111
		exit(0);
112
	    }
113
	    td.xml=xmlbuf+sizeof(unsigned long);
114
	    td.xmllen=((unsigned long*)xmlbuf)[0];
115
	break;
116
	case 1:
117
	    xmlbuf=xmlgen_init(td.size);
118
	    td.xml=xmlbuf;
119
	    td.xmllen=xmlgen();
120
	break;
121
	case 2:
122
	    xmlbuf=opcgen_init(td.size);
123
	    td.xml=xmlbuf;
124
	    td.xmllen=opcgen();
125
	break;
126
    }
127
128
    initXML(&td);
2 by Suren A. Chilingaryan
Intel, Tango, Phobos, and RapidXML parsers; Memory benchmark scripts
129
    if (execute_xml) parseXML(&td,0);
1 by Suren A. Chilingaryan
Initial import
130
131
    gettimeofday(&pre_time,NULL);
132
    initXML_Security(&td);
133
    gettimeofday(&post_time,NULL);
134
    init_time=(post_time.tv_sec-pre_time.tv_sec)*1000000+(post_time.tv_usec-pre_time.tv_usec);
135
136
    gettimeofday(&pre_time,NULL);
2 by Suren A. Chilingaryan
Intel, Tango, Phobos, and RapidXML parsers; Memory benchmark scripts
137
    if (execute_security) {
138
	encryptXML(&td,0);
139
	decryptXML(&td,0);
140
	signXML(&td,0);
141
	verifyXML(&td,0);
142
    }
1 by Suren A. Chilingaryan
Initial import
143
    gettimeofday(&post_time,NULL);
144
    init_time2=(post_time.tv_sec-pre_time.tv_sec)*1000000+(post_time.tv_usec-pre_time.tv_usec);
145
    
146
    ds=disp_init();
147
    de=disp_init();
148
    for (i=1;i<=td.iterations;i++) {
149
	switch (mode) {
150
	    case 1:
151
		td.xmllen=xmlgen();
152
	    break;
153
	    case 2:
154
		td.xmllen=opcgen();
155
	    break;
156
	}
2 by Suren A. Chilingaryan
Intel, Tango, Phobos, and RapidXML parsers; Memory benchmark scripts
157
	if (execute_xml) parseXML(&td,i);
158
	
1 by Suren A. Chilingaryan
Initial import
159
	gettimeofday(&pre_time,NULL);
2 by Suren A. Chilingaryan
Intel, Tango, Phobos, and RapidXML parsers; Memory benchmark scripts
160
	if (execute_security) {
161
	    encryptXML(&td,i);
162
	    decryptXML(&td,i);
163
	}
1 by Suren A. Chilingaryan
Initial import
164
        gettimeofday(&post_time,NULL);
165
	time=(post_time.tv_sec-pre_time.tv_sec)*1000000+(post_time.tv_usec-pre_time.tv_usec);
166
	disp_event(de,time);
167
//	printf("%lu, ",time);
168
169
	gettimeofday(&pre_time,NULL);
2 by Suren A. Chilingaryan
Intel, Tango, Phobos, and RapidXML parsers; Memory benchmark scripts
170
	if (execute_security) {
171
	    signXML(&td,i);
172
	    verifyXML(&td,i);
173
	}
1 by Suren A. Chilingaryan
Initial import
174
        gettimeofday(&post_time,NULL);
175
	time=(post_time.tv_sec-pre_time.tv_sec)*1000000+(post_time.tv_usec-pre_time.tv_usec);
176
	disp_event(ds,time);
177
178
//	printf("%lu\n",time);
179
    }
180
    disp_post(de);
181
    disp_post(ds);
182
183
    releaseXML(&td);
184
    
185
    switch (mode) {
186
	case 0:
187
	    free(xmlbuf);
188
	break;
189
	case 1:
190
	    xmlgen_deinit();
191
	break;
192
	case 2:
193
	    opcgen_deinit();
194
	break;
195
    }
196
197
    if (mode==2) {
198
	printf("Signing/Verifying Time %lf ms for %lu messages\n", ((double)(ds->disp_s)) / 1000,td.iterations);
199
	printf("Encrypting/Decrypting Time %lf ms for %lu messages\n", ((double)(de->disp_s)) / 1000,td.iterations);
200
    } else {
201
	init_dtime=(init_time2 - ds->disp_m - de->disp_m);
202
	if (init_dtime<10) {
203
	    init_d=0;
204
	    init_dtime=0;
205
	} else {
206
	    init_d=300 * (de->disp_d+ds->disp_d) / init_dtime;
207
	    init_dtime/=1000;
208
	}
209
	printf("Initialisation time %.3lf + %.3lf(%.2lf%) ms\n",(1. * init_time) / 1000, init_dtime, init_d);
210
	printf("Signing/Verifying Time %.3lf(%.2lf%) ms\n", (ds->disp_m) / 1000, ds->disp_m ? 300*(ds->disp_d)/(ds->disp_m) : 0);	
211
	printf("Encrypting/Decrypting Time %.3lf(%.2lf%) ms\n", (de->disp_m) / 1000, de->disp_m ? 300*(de->disp_d)/(de->disp_m) : 0);
212
    }
213
    return 0;
214
}
215