Merge remote-tracking branch 'origin/master' into YaSp
[scilab.git] / scilab / modules / development_tools / macros / bench_run.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2007-2008 - INRIA - Pierre MARECHAL <pierre.marechal@inria.fr>
3 // Copyright (C) 2011-2011 - DIGITEO - Bruno JOFRET
4 //
5 // This file must be used under the terms of the CeCILL.
6 // This source file is licensed as described in the file COPYING, which
7 // you should have received as part of this distribution.  The terms
8 // are also available at
9 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10
11 //-----------------------------------------------------------------------------
12 // Launch benchmarks
13 //-----------------------------------------------------------------------------
14
15 function bench_run(varargin)
16
17     lhs = argn(1);
18     rhs = argn(2);
19
20     global test_list;
21     global test_count;
22
23     test_list          = [];
24     test_count         = 0;
25     boucle_for_time    = 0;
26
27     just_list_tests    = %F;
28     print_help         = %F;
29     nb_run             = "10000";
30
31     xml_str            = "";
32
33     // =======================================================
34     // Gestion des tests à lancer
35     // =======================================================
36
37     if (rhs == 0) ..
38         | ((rhs == 1) & (varargin(1)==[])) ..
39         | (((rhs == 2)|(rhs == 3)) & (varargin(1)==[]) & (varargin(2)==[])) then
40
41         // No input argument
42         // bench_run()
43         // bench_run([])
44         // => Launch each test of each module
45
46         module_list = getmodules();
47         module_list = gsort(module_list,"lr","i");
48         for k=1:size(module_list,"*")
49             bench_add_module(module_list(k));
50         end
51
52     elseif (rhs == 1) ..
53         | ((rhs == 2) & (varargin(2)==[])) ..
54         | ((rhs == 3) & (varargin(2)==[])) then
55
56         // One input argument
57         // bench_run(<module_name>)
58         // bench_run([<module_name_1>,<module_name_2>])
59
60         // varargin(1) = [<module_name_1>,<module_name_2>]
61
62         module_mat = varargin(1);
63
64         [nl,nc] = size(module_mat);
65
66         // bench_run([<module_name_1>,<module_name_2>])
67
68         for i=1:nl
69             for j=1:nc
70                 if( with_module(module_mat(i,j)) ) then
71                     bench_add_module(module_mat(i,j));
72                 else
73                     error(sprintf(gettext("%s is not an installed module"),module_mat(i,j)));
74                 end
75             end
76         end
77
78     elseif (rhs == 2) | (rhs == 3) then
79
80         // Two input arguments
81         // bench_run(<module_name>,<test_name>)
82         // bench_run(<module_name>,[<test_name_1>,<test_name_2>] )
83
84         // varargin(1) = <module_name> ==> string 1x1
85         // varargin(2) = <test_name_1> ==> mat nl x nc
86
87         module     = varargin(1);
88         test_mat   = varargin(2);
89
90         if ((or(size(module) <> [1,1])) & (test_mat <> [])) then
91             example = bench_examples();
92             err     = ["" ; gettext("error : Input argument sizes are not valid") ; "" ; example ];
93             printf("%s\n",err);
94             return;
95         end
96
97         [nl,nc] = size(test_mat);
98
99         for i=1:nl
100             for j=1:nc
101
102                 if (fileinfo(SCI+"/modules/"+module+"/tests/benchmarks/"+test_mat(i,j)+".tst")<>[]) then
103                     bench_add_onebench(module,test_mat(i,j));
104                 else
105                     error(sprintf(gettext("The test ""%s"" is not available from the ""%s"" module"),test_mat(i,j),module));
106                 end
107
108             end
109         end
110     else
111         error(msprintf(gettext("%s: Wrong number of input argument(s): %d to %d expected.\n"), "bench_run", 0, 3));
112     end
113
114     // =======================================================
115     // Gestion des options
116     // =======================================================
117
118     if rhs == 3 then
119
120         option_mat =  varargin(3);
121
122         if grep(option_mat,"list") <> [] then
123             just_list_tests    = %T;
124         end
125
126         if grep(option_mat,"help") <> [] then
127             print_help         = %T;
128         end
129
130         if grep(option_mat,"nb_run=") <> [] then
131             nb_run_line = grep(option_mat,"nb_run=");
132             nb_run      = strsubst(option_mat(nb_run_line),"nb_run=","");
133         end
134
135     end
136
137     if print_help then
138
139         // =======================================================
140         // Display help
141         // =======================================================
142
143         example = bench_examples();
144         printf("%s\n",example);
145         return;
146
147     elseif just_list_tests then
148
149         // =======================================================
150         // Just list tests
151         // =======================================================
152
153         printf("\n");
154
155         for i=1:test_count
156             printf("   %03d - ",i);
157             printf("[%s] %s\n",test_list(i,1),test_list(i,2));
158         end
159
160     else
161
162         // =======================================================
163         // Test launch
164         // =======================================================
165
166         printf("\n");
167
168         xml_str = [ xml_str ; "<benchmarks>" ];
169
170         // Calcul de la durée de la boucle for en µs
171
172         tic();
173         for i = 1:1000000
174         end
175         timing = toc();
176         boucle_for_time = timing * 1000;
177
178         printf("            For Loop (as reference) ...........................      %4.2f ms [ 1000000 x]\n\n",boucle_for_time);
179
180         for i=1:test_count
181
182             // Display
183             printf("   %03d/%03d - ",i,test_count);
184             printf("[%s] %s ",test_list(i,1),test_list(i,2));
185             for j = length(test_list(i,2) + test_list(i,1)):45
186                 printf(".");
187             end
188             printf(" ");
189
190             // Bench process
191             [returned_time,nb_run_done] = bench_run_onebench(test_list(i,1),test_list(i,2),nb_run);
192
193             // Display
194             returned_time_str           = sprintf("%4.2f ms",returned_time);
195             for j = length(returned_time_str):13
196                 printf(" ");
197             end
198             printf("%s [",returned_time_str);
199             for j = length(nb_run_done):7
200                 printf(" ");
201             end
202             printf("%s x]\n",nb_run_done);
203
204             // XML print
205             xml_str = [ xml_str ; ..
206             "    <bench>"; ..
207             "        <module>"+test_list(i,1)+"</module>"; ..
208             "        <id>"+test_list(i,2)+"</id>"; ..
209             "        <duration>"+strsubst(returned_time_str," ms","")+"</duration>"; ..
210             "        <nb_run>"+nb_run_done+"</nb_run>"; ..
211             "    </bench>" ];
212
213         end
214
215     end
216
217     // XML management
218     xml_str = [ xml_str ; "</benchmarks>" ];
219     xml_file_name = SCI+"/bench_"+getversion()+"_"+date()+".xml";
220     ierr = execstr("fd_xml = mopen(xml_file_name,''wt'');","errcatch");
221     if ierr == 999 then
222         xml_file_name = SCIHOME + "/bench_" + getversion() + "_" + date() +".xml";
223         ierr = execstr("fd_xml = mopen(xml_file_name,''wt'');","errcatch");
224     end
225
226     if ierr == 0 then
227         mputl(xml_str, fd_xml);
228         mclose(fd_xml);
229     end
230
231     clearglobal test_list;
232     clearglobal test_count;
233     clearglobal boucle_for_time;
234
235 endfunction
236
237 //-----------------------------------------------------------------------------
238 // Pierre MARECHAL
239 // Scilab team
240 // Date : 28 oct. 2007
241 //
242 // => List all test files in the module <module_mat>
243 // => Add them to the test_mat matrix
244 //-----------------------------------------------------------------------------
245
246 function bench_add_module(module_mat,test_type)
247
248     module_test_dir = SCI+"/modules/"+module_mat+"/tests/benchmarks";
249     test_mat        = gsort(basename(listfiles(module_test_dir+"/*.tst")),"lr","i");
250
251     nl = size(test_mat,"*");
252     for i=1:nl
253         bench_add_onebench(module_mat,test_mat(i));
254     end
255
256 endfunction
257
258 //-----------------------------------------------------------------------------
259 // Pierre MARECHAL
260 // Scilab team
261 // Date : 28 oct. 2007
262 //
263 // => Add the test <test> to the test_mat matrix
264 //-----------------------------------------------------------------------------
265
266 function bench_add_onebench(module,test)
267
268     global test_list;
269     global test_count;
270
271     test_count = test_count + 1;
272
273     test_list( test_count , 1 ) = module;
274     test_list( test_count , 2 ) = test;
275
276 endfunction
277
278 //-----------------------------------------------------------------------------
279 // Pierre MARECHAL
280 // Scilab team
281 // Date : 28 oct. 2007
282 //
283 // => Run one test
284 //-----------------------------------------------------------------------------
285
286 function [returned_time,nb_run_done] = bench_run_onebench(module,test,nb_run)
287
288     returned_time = 0;
289
290     fullPath      = SCI+"/modules/"+module+"/tests/benchmarks/"+test;
291
292     tstfile       = pathconvert(fullPath+".tst",%f,%f);
293     scefile       = pathconvert(TMPDIR+"/"+test+".sce",%f,%f);
294
295     // Get the tst file
296     txt = mgetl(tstfile);
297
298     // Check if the nb run is defined in the test
299
300     check_nb_run_line = grep(txt,"<-- BENCH NB RUN :");
301
302     nb_run_done   = nb_run;
303
304     if check_nb_run_line <> [] then
305         nb_run_line   = txt(check_nb_run_line);
306         nb_run_start  = strindex(nb_run_line,"<-- BENCH NB RUN :") + length("<-- BENCH NB RUN :");
307         nb_run_end    = strindex(nb_run_line,"-->") - 1;
308         nb_run        = stripblanks(part(nb_run_line,[nb_run_start:nb_run_end]));
309         nb_run_done   = nb_run;
310     end
311
312     // get the <-- BENCH START --> and <-- BENCH END --> tags
313     line_start = grep(txt,"<-- BENCH START -->");
314     line_end   = grep(txt,"<-- BENCH END -->");
315
316     // Get the context and the bench
317     context    = txt([1:line_start-1]);
318     bench      = txt([line_start+1:line_end-1]);
319
320     // Remove blank lines
321     context(find(context == "" )) = [];
322     bench  (find(bench   == "" )) = [];
323
324     tst_str = [ context ;
325     "nb_run = "+nb_run+";";
326     "tic();";
327     "for __loop_iterator__ = 1:nb_run";
328     bench;
329     "end";
330     "timing = toc();";
331     "returned_time = timing * 1000;"]
332
333     mputl(tst_str,scefile);
334     exec(scefile);
335     returned_time = returned_time - (boucle_for_time * nb_run / 1d6)
336     return;
337
338 endfunction
339
340 //-----------------------------------------------------------------------------
341 // Pierre MARECHAL
342 // Scilab team
343 // Date : 28 oct. 2007
344 //
345 // => Check ref or generate ref
346 //-----------------------------------------------------------------------------
347
348 function example = bench_examples()
349
350     example = [ sprintf("Examples :\n\n") ];
351
352     example = [ example ; sprintf("// Launch all tests\n") ];
353     example = [ example ; sprintf("bench_run();\n") ];
354     example = [ example ; sprintf("bench_run([]);\n") ];
355     example = [ example ; sprintf("bench_run([],[]);\n") ];
356     example = [ example ; "" ];
357     example = [ example ; sprintf("// Test one or several module\n") ];
358     example = [ example ; sprintf("bench_run(''core'');\n") ];
359     example = [ example ; sprintf("bench_run(''core'',[]);\n") ];
360     example = [ example ; sprintf("bench_run([''core'',''string'']);\n") ];
361     example = [ example ; "" ];
362     example = [ example ; sprintf("// Launch one or several test in a specified module\n") ];
363     example = [ example ; sprintf("bench_run(''core'',[''trycatch'',''opcode'']);\n") ];
364     example = [ example ; "" ];
365     example = [ example ; sprintf("// With options\n") ];
366     example = [ example ; sprintf("bench_run([],[],''list'');\n") ];
367     example = [ example ; sprintf("bench_run([],[],''help'');\n") ];
368     example = [ example ; sprintf("bench_run([],[],''nb_run=2000'');\n") ];
369     example = [ example ; "" ];
370
371 endfunction