bench: add bench json output for blockstore
This commit is contained in:
parent
620f21d6f5
commit
64fb7c1d88
@ -61,7 +61,7 @@ const config = {
|
|||||||
},
|
},
|
||||||
'output': {
|
'output': {
|
||||||
value: true,
|
value: true,
|
||||||
valid: a => (a === 'json' || a === 'bench'),
|
valid: a => (a === 'json' || a === 'bench' || a === 'benchjson'),
|
||||||
fallback: 'bench'
|
fallback: 'bench'
|
||||||
},
|
},
|
||||||
'unsafe': {
|
'unsafe': {
|
||||||
@ -139,6 +139,8 @@ const distribution = [
|
|||||||
|
|
||||||
if (settings.output === 'bench') {
|
if (settings.output === 'bench') {
|
||||||
output = new BenchOutput();
|
output = new BenchOutput();
|
||||||
|
} else if (settings.output === 'benchjson') {
|
||||||
|
output = new BenchJSONOutput();
|
||||||
} else if (settings.output === 'json') {
|
} else if (settings.output === 'json') {
|
||||||
output = new JSONOutput();
|
output = new JSONOutput();
|
||||||
}
|
}
|
||||||
@ -235,8 +237,8 @@ class JSONOutput {
|
|||||||
process.stdout.write(',');
|
process.stdout.write(',');
|
||||||
|
|
||||||
const since = [start[0] - this.time[0], start[1] - this.time[1]];
|
const since = [start[0] - this.time[0], start[1] - this.time[1]];
|
||||||
const smicro = (since[0] * 1000000) + (since[1] / 1000);
|
const smicro = hrToMicro(since);
|
||||||
const emicro = (elapsed[0] * 1000000) + (elapsed[1] / 1000);
|
const emicro = hrToMicro(elapsed);
|
||||||
|
|
||||||
process.stdout.write(`{"type":"${type}","start":${smicro},`);
|
process.stdout.write(`{"type":"${type}","start":${smicro},`);
|
||||||
process.stdout.write(`"elapsed":${emicro},"length":${length},`);
|
process.stdout.write(`"elapsed":${emicro},"length":${length},`);
|
||||||
@ -267,7 +269,7 @@ class BenchOutput {
|
|||||||
}
|
}
|
||||||
|
|
||||||
result(type, start, elapsed, length) {
|
result(type, start, elapsed, length) {
|
||||||
const micro = (elapsed[0] * 1000000) + (elapsed[1] / 1000);
|
const micro = hrToMicro(elapsed);
|
||||||
|
|
||||||
if (!this.results[type])
|
if (!this.results[type])
|
||||||
this.results[type] = {};
|
this.results[type] = {};
|
||||||
@ -325,34 +327,14 @@ class BenchOutput {
|
|||||||
this.stdout.write(`${'-'.repeat(85)}\n`);
|
this.stdout.write(`${'-'.repeat(85)}\n`);
|
||||||
|
|
||||||
for (const length in this.results[type]) {
|
for (const length in this.results[type]) {
|
||||||
const times = this.results[type][length];
|
const cal = calculate(this.results[type][length]);
|
||||||
|
|
||||||
times.sort((a, b) => a - b);
|
|
||||||
|
|
||||||
let min = Infinity;
|
|
||||||
let max = 0;
|
|
||||||
|
|
||||||
let total = 0;
|
|
||||||
|
|
||||||
for (const micro of times) {
|
|
||||||
if (micro < min)
|
|
||||||
min = micro;
|
|
||||||
|
|
||||||
if (micro > max)
|
|
||||||
max = micro;
|
|
||||||
|
|
||||||
total += micro;
|
|
||||||
}
|
|
||||||
|
|
||||||
const average = total / times.length;
|
|
||||||
const median = times[times.length / 2 | 0];
|
|
||||||
|
|
||||||
this.stdout.write(`${format(length)}`);
|
this.stdout.write(`${format(length)}`);
|
||||||
this.stdout.write(`${format(times.length.toString())}`);
|
this.stdout.write(`${format(cal.operations.toString())}`);
|
||||||
this.stdout.write(`${format(min)}`);
|
this.stdout.write(`${format(cal.min)}`);
|
||||||
this.stdout.write(`${format(max)}`);
|
this.stdout.write(`${format(cal.max)}`);
|
||||||
this.stdout.write(`${format(average)}`);
|
this.stdout.write(`${format(cal.average)}`);
|
||||||
this.stdout.write(`${format(median)}`);
|
this.stdout.write(`${format(cal.median)}`);
|
||||||
this.stdout.write('\n');
|
this.stdout.write('\n');
|
||||||
}
|
}
|
||||||
this.stdout.write('\n');
|
this.stdout.write('\n');
|
||||||
@ -361,6 +343,95 @@ class BenchOutput {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class BenchJSONOutput {
|
||||||
|
constructor() {
|
||||||
|
this.time = null;
|
||||||
|
this.results = {};
|
||||||
|
this.stdout = process.stdout;
|
||||||
|
}
|
||||||
|
|
||||||
|
start() {
|
||||||
|
this.time = process.hrtime();
|
||||||
|
}
|
||||||
|
|
||||||
|
result(type, start, elapsed, length) {
|
||||||
|
const micro = hrToMicro(elapsed);
|
||||||
|
|
||||||
|
if (!this.results[type])
|
||||||
|
this.results[type] = {};
|
||||||
|
|
||||||
|
if (!this.results[type][length])
|
||||||
|
this.results[type][length] = [];
|
||||||
|
|
||||||
|
this.results[type][length].push(micro);
|
||||||
|
}
|
||||||
|
|
||||||
|
end() {
|
||||||
|
const report = {
|
||||||
|
summary: [],
|
||||||
|
time: hrToMicro(process.hrtime(this.time)),
|
||||||
|
elapsed: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const type in this.results) {
|
||||||
|
for (const length in this.results[type]) {
|
||||||
|
const cal = calculate(this.results[type][length]);
|
||||||
|
|
||||||
|
report.elapsed += cal.total;
|
||||||
|
|
||||||
|
report.summary.push({
|
||||||
|
type: type,
|
||||||
|
length: length,
|
||||||
|
operations: cal.operations,
|
||||||
|
min: cal.min,
|
||||||
|
max: cal.max,
|
||||||
|
average: cal.average,
|
||||||
|
median: cal.median
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.stdout.write(JSON.stringify(report, null, 2));
|
||||||
|
this.stdout.write('\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function hrToMicro(time) {
|
||||||
|
return (time[0] * 1000000) + (time[1] / 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
function calculate(times) {
|
||||||
|
times.sort((a, b) => a - b);
|
||||||
|
|
||||||
|
let min = Infinity;
|
||||||
|
let max = 0;
|
||||||
|
|
||||||
|
let total = 0;
|
||||||
|
|
||||||
|
for (const micro of times) {
|
||||||
|
if (micro < min)
|
||||||
|
min = micro;
|
||||||
|
|
||||||
|
if (micro > max)
|
||||||
|
max = micro;
|
||||||
|
|
||||||
|
total += micro;
|
||||||
|
}
|
||||||
|
|
||||||
|
const average = total / times.length;
|
||||||
|
const median = times[times.length / 2 | 0];
|
||||||
|
const operations = times.length;
|
||||||
|
|
||||||
|
return {
|
||||||
|
total,
|
||||||
|
operations,
|
||||||
|
min,
|
||||||
|
max,
|
||||||
|
average,
|
||||||
|
median
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function processArgs(argv, config) {
|
function processArgs(argv, config) {
|
||||||
const args = {};
|
const args = {};
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user