run-octane.js revision 6:5a1b0714df0e
1/*
2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/**
25 * @subtest
26 */
27
28var tests = [
29    "box2d.js",
30    "code-load.js",
31    "crypto.js",
32    "deltablue.js",
33    "earley-boyer.js",
34    "gbemu.js",
35    "navier-stokes.js",
36    "pdfjs.js",
37    "raytrace.js",
38    "regexp.js",
39    "richards.js",
40    "splay.js"
41];
42
43// hack, teardown breaks things defined in the global space, making it impossible
44// to do multiple consecutive benchmark runs with the same harness. I think it's a bug
45// that the setup and teardown aren't each others constructor and destructor but rather
46// that the benchmarks rely on partial global state. For shame, Octane!
47var ignoreTeardown = [
48    { name: "box2d.js" },
49    { name: "gbemu.js" },
50];
51
52var dir = (typeof(__DIR__) == 'undefined') ? "test/script/basic/" : __DIR__;
53
54// TODO: why is this path hard coded when it's defined in project properties?
55var path = dir + "../external/octane/benchmarks/";
56
57var runtime = "";
58var verbose = false;
59
60var numberOfIterations = 5;
61
62function endsWith(str, suffix) {
63    return str.indexOf(suffix, str.length - suffix.length) !== -1;
64}
65
66function run_one_benchmark(arg, iters) {
67
68    load(path + 'base.js');
69    load(arg);
70
71    var file_name;
72
73    var file = arg.split('/');
74    if (file.length == 1) {
75        file = arg.split('\\');
76    }
77
78    //trim off trailing path separators
79    while (file[file.length - 1].indexOf(".js") == -1) {
80	file.pop();
81    }
82    file_name = file[file.length - 1];
83
84    if (typeof compile_only !== 'undefined') {
85	print("Compiled OK: " + file_name);
86	return;
87    }
88
89    var success = true;
90    var hiscore = 0;
91    var loscore = 10e8;
92    var current_name;
93
94    function PrintResult(name, result) {
95	current_name = name;
96    }
97
98    function PrintError(name, error) {
99	current_name = name;
100	PrintResult(name, error);
101	success = false;
102    }
103
104    function PrintScore(score) {
105	if (success) {
106	    if (+score >= hiscore) {
107		hiscore = +score;
108	    }
109	    if (+score <= loscore) {
110		loscore = +score;
111	    }
112	}
113
114	if (verbose) {
115	    print("Score: " + score);
116	}
117    }
118
119    if (iters == undefined) {
120	iters = numberOfIterations;
121    } else {
122	numberOfIterations = iters;
123    }
124
125    print(runtime + ": running " + file_name + "...");
126
127    for (var i = 0; i < numberOfIterations; i++) {
128	var callbacks =
129	    { NotifyResult: PrintResult,
130	      NotifyError: PrintError,
131	      NotifyScore: PrintScore };
132
133	for (j in ignoreTeardown) {
134	    var ignore = ignoreTeardown[j];
135	    if (endsWith(arg, ignore.name)) {
136		var teardownOverride = ignore.teardown;
137		if (!teardownOverride) {
138		    teardownOverride = function() {};
139		}
140
141		for (k in BenchmarkSuite.suites) {
142		    var benchmarks = BenchmarkSuite.suites[k].benchmarks;
143		    for (l in benchmarks) {
144			benchmarks[l].TearDown = teardownOverride;
145		    }
146                }
147		break;
148	    }
149	}
150
151	BenchmarkSuite.RunSuites(callbacks);
152    }
153
154    var start = "Score: ";
155    if (runtime != "") {
156	start = runtime + ": ";
157    }
158    print(start + current_name + ' (version ' + BenchmarkSuite.version + '): ' + loscore + '-' + hiscore);
159}
160
161function run_suite(tests, iters) {
162    for (var idx = 0; idx < tests.length; idx++) {
163	run_one_benchmark(tests[idx], iters, false);
164    }
165}
166
167runtime = "command line";
168
169var args = [];
170if (typeof $ARGS !== 'undefined') {
171    args = $ARGS;
172} else if (typeof arguments !== 'undefined' && arguments.length != 0) {
173    args = arguments;
174}
175
176var new_args = [];
177for (i in args) {
178    if (args[i].toString().indexOf(' ') != -1) {
179	args[i] = args[i].replace(/\/$/, '');
180	var s = args[i].split(' ');
181	for (j in s) {
182	    new_args.push(s[j]);
183	}
184    } else {
185	new_args.push(args[i]);
186    }
187}
188
189if (new_args.length != 0) {
190    args = new_args;
191}
192
193var tests_found = [];
194var iters = undefined;
195
196for (var i = 0; i < args.length; i++) {
197    arg = args[i];
198    if (arg == "--iterations") {
199	iters = +args[++i];
200    } else if (arg == "--runtime") {
201	runtime = args[++i];
202    } else if (arg == "--verbose") {
203	verbose = true;
204    } else if (arg == "") {
205	continue; //skip
206    } else {
207	tests_found.push(arg);
208    }
209}
210
211if (tests_found.length == 0) {
212    for (i in tests) {
213	tests_found.push(path + tests[i]);
214    }
215}
216
217tests_found.sort();
218
219run_suite(tests_found, iters);
220
221
222
223