You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
4.2 KiB
JavaScript

"use strict";
/* eslint-env browser, jquery */
const Runner = require( "./runner.js" );
const benchmarks = require( "./benchmarks.js" );
let BRANCH = location.hash.match( /branch=([^&]*)/i );
BRANCH = BRANCH ? BRANCH[ 1 ] : "master";
$( "#run" ).click( () => {
// Results Table Manipulation
const resultsTable = $( "#results-table" );
function appendResult( klass, title, url, inputSize, parseTime ) {
const KB = 1024;
const MS_IN_S = 1000;
resultsTable.append( `
<tr class='${ klass }'>
<td class='title'>
${ url !== null ? "<a href='" + url + "'>" : "" }
${ title }
${ url !== null ? "</a>" : "" }
</td>
<td class='input-size'>
<span class='value'>
${ ( inputSize / KB ).toFixed( 2 ) }
</span>
&nbsp;<span class='unit'>kB</span>
</td>
<td class='parse-time'>
<span class='value'>
${ parseTime.toFixed( 2 ) }
</span>
&nbsp;<span class='unit'>ms</span>
</td>
<td class='parse-speed'>
<span class='value'>
${ ( ( inputSize / KB ) / ( parseTime / MS_IN_S ) ).toFixed( 2 ) }
</span>
&nbsp;<span class='unit'>kB/s</span>
</td>
</tr>
` );
}
// Main
// Each input is parsed multiple times and the results are averaged. We
// do this for two reasons:
//
// 1. To warm up the interpreter (PEG.js-generated parsers will be
// most likely used repeatedly, so it makes sense to measure
// performance after warming up).
//
// 2. To minimize random errors.
const runCount = parseInt( $( "#run-count" ).val(), 10 );
const options = {
cache: $( "#cache" ).is( ":checked" ),
optimize: $( "#optimize" ).val()
};
if ( isNaN( runCount ) || runCount <= 0 ) {
alert( "Number of runs must be a positive integer." );
return;
}
Runner.run( benchmarks, runCount, options, {
readFile( file ) {
return $.ajax( {
type: "GET",
url: `https://raw.githubusercontent.com/pegjs/pegjs/${ BRANCH }/` + file,
dataType: "text",
async: false
} ).responseText;
},
testStart() {
// Nothing to do.
},
testFinish( benchmark, test, inputSize, parseTime ) {
appendResult(
"individual",
test.title,
"tools/benchmark/" + benchmark.id + "/" + test.file,
`https://raw.githubusercontent.com/pegjs/pegjs/${ BRANCH }/tools/benchmark/${ benchmark.id }/${ test.file }`,
inputSize,
parseTime
);
},
benchmarkStart( benchmark ) {
resultsTable.append( `
<tr class='heading'>
<th colspan='4'>
<a href='https://github.com/pegjs/pegjs/blob/${ BRANCH }/examples/${ benchmark.id }.pegjs'> ${ benchmark.title } </a>
</th>
</tr>"
` );
},
benchmarkFinish( benchmark, inputSize, parseTime ) {
appendResult(
"benchmark-total",
benchmark.title + " total",
null,
inputSize,
parseTime
);
},
start() {
$( "#run-count, #cache, #run" ).attr( "disabled", "disabled" );
resultsTable.show();
$( "#results-table tr" ).slice( 1 ).remove();
},
finish( inputSize, parseTime ) {
appendResult(
"total",
"Total",
null,
inputSize,
parseTime
);
$.scrollTo( "max", { axis: "y", duration: 500 } );
$( "#run-count, #cache, #run" ).removeAttr( "disabled" );
}
} );
} );
$( document ).ready( () => $( "#run" ).focus() );