JavaScript-QuickJS
view release on metacpan or search on metacpan
quickjs/tests/microbench.js view on Meta::CPAN
str = " " + str;
return str;
}
function pad_center(str, n) {
str += "";
while (str.length < n) {
if ((n - str.length) & 1)
str = str + " ";
else
str = " " + str;
}
return str;
}
function toPrec(n, prec) {
var i, s;
for (i = 0; i < prec; i++)
n *= 10;
s = "" + Math.round(n);
for (i = s.length - prec; i <= 0; i++)
s = "0" + s;
if (prec > 0)
s = s.substring(0, i) + "." + s.substring(i);
return s;
}
var ref_data;
var log_data;
var heads = [ "TEST", "N", "TIME (ns)", "REF (ns)", "SCORE (%)" ];
var widths = [ 22, 10, 9, 9, 9 ];
var precs = [ 0, 0, 2, 2, 2 ];
var total = [ 0, 0, 0, 0, 0 ];
var total_score = 0;
var total_scale = 0;
if (typeof console == "undefined") {
var console = { log: print };
}
function log_line() {
var i, n, s, a;
s = "";
for (i = 0, n = arguments.length; i < n; i++) {
if (i > 0)
s += " ";
a = arguments[i];
if (typeof a == "number") {
total[i] += a;
a = toPrec(a, precs[i]);
s += pad_left(a, widths[i]);
} else {
s += pad_left(a, widths[i]);
}
}
console.log(s);
}
var clocks_per_sec = 1000;
var max_iterations = 10;
var clock_threshold = 100; /* favoring short measuring spans */
var min_n_argument = 1;
//var get_clock = Date.now;
var get_clock = os.now;
function log_one(text, n, ti) {
var ref;
if (ref_data)
ref = ref_data[text];
else
ref = null;
ti = Math.round(ti * 100) / 100;
log_data[text] = ti;
if (typeof ref === "number") {
log_line(text, n, ti, ref, ti * 100 / ref);
total_score += ti * 100 / ref;
total_scale += 100;
} else {
log_line(text, n, ti);
total_score += 100;
total_scale += 100;
}
}
function bench(f, text)
{
var i, j, n, t, t1, ti, nb_its, ref, ti_n, ti_n1, min_ti;
nb_its = n = 1;
if (f.bench) {
ti_n = f(text);
} else {
ti_n = 1000000000;
min_ti = clock_threshold / 10;
for(i = 0; i < 30; i++) {
ti = 1000000000;
for (j = 0; j < max_iterations; j++) {
t = get_clock();
while ((t1 = get_clock()) == t)
continue;
nb_its = f(n);
if (nb_its < 0)
return; // test failure
t1 = get_clock() - t1;
if (ti > t1)
ti = t1;
}
if (ti >= min_ti) {
ti_n1 = ti / nb_its;
if (ti_n > ti_n1)
ti_n = ti_n1;
}
if (ti >= clock_threshold && n >= min_n_argument)
break;
n = n * [ 2, 2.5, 2 ][i % 3];
}
// to use only the best timing from the last loop, uncomment below
//ti_n = ti / nb_its;
}
/* nano seconds per iteration */
log_one(text, n, ti_n * 1e9 / clocks_per_sec);
}
var global_res; /* to be sure the code is not optimized */
function empty_loop(n) {
var j;
for(j = 0; j < n; j++) {
}
return n;
}
function date_now(n) {
var j;
for(j = 0; j < n; j++) {
Date.now();
}
return n;
}
function prop_read(n)
{
var obj, sum, j;
obj = {a: 1, b: 2, c:3, d:4 };
sum = 0;
for(j = 0; j < n; j++) {
sum += obj.a;
sum += obj.b;
sum += obj.c;
sum += obj.d;
}
global_res = sum;
return n * 4;
}
function prop_write(n)
( run in 0.607 second using v1.01-cache-2.11-cpan-71847e10f99 )