/xmlbench/trunk

To get this branch, use:
bzr branch http://darksoft.org/webbzr/xmlbench/trunk

« back to all changes in this revision

Viewing changes to xsl/tools2.h

  • Committer: Suren A. Chilingaryan
  • Date: 2009-02-16 09:27:17 UTC
  • Revision ID: csa@dside.dyndns.org-20090216092717-wipyvaaw2srxhgns
Initial import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#include <stdlib.h>
 
2
#include <unistd.h>
 
3
#include <sys/types.h>
 
4
#include <sys/stat.h>
 
5
 
 
6
#include "../tools/disp.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 *scfn;
 
15
    char *xml;
 
16
    unsigned long xmllen;
 
17
    char *xsl;
 
18
    unsigned long xsllen;
 
19
    unsigned long size;
 
20
};
 
21
 
 
22
char *ReadFile(char *fn) {
 
23
    FILE *f;
 
24
    struct stat st;
 
25
    char *buf;
 
26
    
 
27
    f=fopen(fn,"r");
 
28
    if (!f) {
 
29
        printf("Can't open XML file!\n");
 
30
        exit(1);
 
31
    }
 
32
    fstat(f->_fileno,&st);
 
33
    buf=(char*)malloc(st.st_size+sizeof(unsigned long)+1);
 
34
    if (!buf) {
 
35
        printf("Can't allocate memory!\n");
 
36
        exit(1);
 
37
    }
 
38
    ((unsigned long*)buf)[0]=st.st_size;
 
39
    fread(buf+sizeof(unsigned long),st.st_size,1,f);
 
40
    fclose(f);
 
41
    buf[st.st_size+sizeof(unsigned long)]=0;
 
42
    return buf;
 
43
}
 
44
 
 
45
void ReadConfig(struct TestData *td) {
 
46
    FILE *f;
 
47
    f=fopen("config","r");
 
48
    if (!f) {
 
49
        printf("Error opening config file!\n");
 
50
        exit(1);
 
51
    }
 
52
    fscanf(f,"%lu",&(td->iterations));
 
53
    fclose(f);
 
54
}
 
55
 
 
56
void parseXML(struct TestData *td, unsigned long iter);
 
57
void transformXML(struct TestData *td, unsigned long iter);
 
58
void initXML_Transformation(struct TestData *td);
 
59
void initXML(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] [<xsl file>|<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,*xslbuf;
 
80
 
 
81
    if (argc!=4) Usage(argv[0]);
 
82
 
 
83
    td.iterations = atol(argv[1]);
 
84
    if (td.iterations<=0) Usage(argv[0]);
 
85
    
 
86
    if (!strncmp(argv[2],"xmlgen",6)) mode=1;
 
87
    else if (!strncmp(argv[2],"opcgen",6)) mode=2;
 
88
    td.fn=argv[2];
 
89
 
 
90
    if (mode) {
 
91
        td.size = atol(argv[3]);
 
92
        if (td.size<=0) Usage(argv[0]);
 
93
        td.scfn = (char*)malloc(32);
 
94
        
 
95
        rnd_init();     /* Initialising Random Generator */
 
96
    }
 
97
 
 
98
    switch (mode) {
 
99
        case 0:
 
100
            xmlbuf=ReadFile(argv[2]);
 
101
            if (!xmlbuf) {
 
102
                fprintf(stderr,"Can't read XML file!\n");
 
103
                exit(0);
 
104
            }
 
105
            td.xml=xmlbuf+sizeof(unsigned long);
 
106
            td.xmllen=((unsigned long*)xmlbuf)[0];
 
107
 
 
108
            td.scfn=argv[3];
 
109
        break;
 
110
        case 1:
 
111
            xmlbuf=xmlgen_init(td.size);
 
112
            td.xml=xmlbuf;
 
113
            td.xmllen=xmlgen();
 
114
 
 
115
            strcpy(td.scfn,"../xml.files/generated.xsl");
 
116
        break;
 
117
        case 2:
 
118
            xmlbuf=opcgen_init(td.size);
 
119
            td.xml=xmlbuf;
 
120
            td.xmllen=opcgen();
 
121
 
 
122
            strcpy(td.scfn,"../xml.files/opc.xsl");
 
123
            fprintf(stderr,"OPC XML Transformation not supported!\n");
 
124
            exit(0);
 
125
        break;
 
126
    }
 
127
 
 
128
    xslbuf=ReadFile(td.scfn);
 
129
    if (!xslbuf) {
 
130
        fprintf(stderr,"Can't read XSL file!\n");
 
131
        exit(0);
 
132
    }
 
133
 
 
134
    td.xsl=xslbuf+sizeof(unsigned long);
 
135
    td.xsllen=((unsigned long*)xslbuf)[0];
 
136
 
 
137
    
 
138
    initXML(&td);
 
139
    parseXML(&td,0);
 
140
 
 
141
    disp_init();
 
142
    for (i=1;i<=td.iterations;i++) {
 
143
        switch (mode) {
 
144
            case 1:
 
145
                td.xmllen=xmlgen();
 
146
            break;
 
147
            case 2:
 
148
                td.xmllen=opcgen();
 
149
            break;
 
150
        }
 
151
        gettimeofday(&pre_time,NULL);
 
152
        parseXML(&td,i);
 
153
        gettimeofday(&post_time,NULL);
 
154
        time=(post_time.tv_sec-pre_time.tv_sec)*1000000+(post_time.tv_usec-pre_time.tv_usec);
 
155
        disp_event(time);
 
156
//      printf("%lu\n",time);
 
157
    }
 
158
    disp_post();
 
159
    parse_m = disp_m;
 
160
    parse_s = disp_s;
 
161
    parse_d = disp_d;
 
162
 
 
163
    rnd_init(); /* Restarting random generator */
 
164
 
 
165
 
 
166
 
 
167
    gettimeofday(&pre_time,NULL);
 
168
    initXML_Transformation(&td);
 
169
    gettimeofday(&post_time,NULL);
 
170
    init_time=(post_time.tv_sec-pre_time.tv_sec)*1000000+(post_time.tv_usec-pre_time.tv_usec);
 
171
 
 
172
    gettimeofday(&pre_time,NULL);
 
173
    transformXML(&td,0);
 
174
    gettimeofday(&post_time,NULL);
 
175
    init_time2=(post_time.tv_sec-pre_time.tv_sec)*1000000+(post_time.tv_usec-pre_time.tv_usec);
 
176
 
 
177
    disp_init();
 
178
    for (i=1;i<=td.iterations;i++) {
 
179
        switch (mode) {
 
180
            case 1:
 
181
                td.xmllen=xmlgen();
 
182
            break;
 
183
            case 2:
 
184
                td.xmllen=opcgen();
 
185
            break;
 
186
        }
 
187
        parseXML(&td,i);
 
188
        gettimeofday(&pre_time,NULL);
 
189
        transformXML(&td,i);
 
190
        gettimeofday(&post_time,NULL);
 
191
        time=(post_time.tv_sec-pre_time.tv_sec)*1000000+(post_time.tv_usec-pre_time.tv_usec);
 
192
        disp_event(time);
 
193
//      printf("%lu\n",time);
 
194
    }
 
195
    disp_post();
 
196
 
 
197
    releaseXML(&td);
 
198
    
 
199
    switch (mode) {
 
200
        case 0:
 
201
            free(xmlbuf);
 
202
        break;
 
203
        case 1:
 
204
            xmlgen_deinit();
 
205
        break;
 
206
        case 2:
 
207
            opcgen_deinit();
 
208
        break;
 
209
    }
 
210
    free(xslbuf);
 
211
    if (mode) free(td.scfn);
 
212
    
 
213
 
 
214
    if (mode==2) 
 
215
        printf("XSL Transformation Time %lf ms for %lu messages\n", ((double)(disp_s)) / 1000,td.iterations);
 
216
    else {
 
217
        init_dtime=(init_time2 - disp_m);
 
218
        if (init_dtime<10) {
 
219
            init_d=0;
 
220
            init_dtime=0;
 
221
        } else {
 
222
            init_d=300 * disp_d / init_dtime;
 
223
            init_dtime/=1000;
 
224
        }
 
225
        printf("Initialisation time %.3lf + %.3lf(%.2lf%) ms\nXSL Transformation Time %.3lf(%.2lf%) ms\n",(1. * init_time) / 1000, init_dtime, init_d, (disp_m - parse_m) / 1000, 300*(disp_d+parse_d)/(disp_m-parse_m));
 
226
    }
 
227
 
 
228
    return 0;
 
229
}
 
230