110 lines
4.1 KiB
JavaScript
110 lines
4.1 KiB
JavaScript
|
/**
|
||
|
* Command line application to process the output of
|
||
|
* make skps_release_and_SIMD
|
||
|
* and present some statistical results in a human-readable table format.
|
||
|
*/
|
||
|
|
||
|
const fs = require('fs');
|
||
|
|
||
|
// These files are the output of `make skps_release_and_SIMD`
|
||
|
const SIMD_DATA = JSON.parse(fs.readFileSync('simd_out.json', 'utf8'));
|
||
|
const RELEASE_DATA = JSON.parse(fs.readFileSync('release_out.json', 'utf8'));
|
||
|
|
||
|
let skp_names = new Set();
|
||
|
for (const key of Object.keys(SIMD_DATA)) {
|
||
|
skp_names.add(key)
|
||
|
}
|
||
|
for (const key of Object.keys(RELEASE_DATA)) {
|
||
|
skp_names.add(key)
|
||
|
}
|
||
|
|
||
|
let simd_frame_average_accumulator = 0;
|
||
|
let simd_frame_median_accumulator = 0;
|
||
|
let release_frame_average_accumulator = 0;
|
||
|
let release_frame_median_accumulator = 0;
|
||
|
const comparisonData = [];
|
||
|
|
||
|
for (const skp_name of skp_names) {
|
||
|
if (SIMD_DATA[skp_name] && RELEASE_DATA[skp_name]) {
|
||
|
// note: frames are frametimes, measured in ms
|
||
|
const simd_frames = SIMD_DATA[skp_name].total_frame_ms;
|
||
|
const simd_frames_average = averageFromArray(simd_frames);
|
||
|
const simd_frames_median = medianFromArray(simd_frames);
|
||
|
simd_frame_average_accumulator += simd_frames_average;
|
||
|
simd_frame_median_accumulator += simd_frames_median;
|
||
|
|
||
|
const release_frames = RELEASE_DATA[skp_name].total_frame_ms;
|
||
|
const release_frames_average = averageFromArray(release_frames);
|
||
|
const release_frames_median = medianFromArray(release_frames);
|
||
|
release_frame_average_accumulator += release_frames_average;
|
||
|
release_frame_median_accumulator += release_frames_median;
|
||
|
|
||
|
comparisonData.push({
|
||
|
skp_name: skp_name,
|
||
|
frames_average_difference: release_frames_average - simd_frames_average,
|
||
|
frames_median_difference: release_frames_median - simd_frames_median,
|
||
|
simd_frames_median: simd_frames_median,
|
||
|
simd_frames_average: simd_frames_average,
|
||
|
release_frames_average: release_frames_average,
|
||
|
release_frames_median: release_frames_median
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
const simd_average_frame = simd_frame_average_accumulator / comparisonData.length;
|
||
|
const simd_skps_median_frame = simd_frame_median_accumulator / comparisonData.length;
|
||
|
const release_average_frame = release_frame_average_accumulator / comparisonData.length;
|
||
|
const release_median_frame = release_frame_median_accumulator / comparisonData.length;
|
||
|
|
||
|
console.log('\nAverages across all SKP files');
|
||
|
console.table({
|
||
|
'Average frame time average': {
|
||
|
'release CanvasKit build (ms)': release_average_frame.toFixed(2),
|
||
|
'experimental_simd CanvasKit build (ms)': simd_average_frame.toFixed(2),
|
||
|
'difference (ms)': (release_average_frame - simd_average_frame).toFixed(2)
|
||
|
},
|
||
|
'Median frame time average': {
|
||
|
'release CanvasKit build (ms)': release_median_frame.toFixed(2),
|
||
|
'experimental_simd CanvasKit build (ms)': simd_skps_median_frame.toFixed(2),
|
||
|
'difference (ms)': (release_median_frame - simd_skps_median_frame).toFixed(2)
|
||
|
}
|
||
|
});
|
||
|
|
||
|
const frameTimeMedianDifferenceSorted =
|
||
|
comparisonData.sort(
|
||
|
({frames_median_difference: m1}, {frames_median_difference: m2}) => m2 - m1
|
||
|
);
|
||
|
|
||
|
console.log('\nBest 3 Individual SKP frame time median differences in favor of the SIMD build');
|
||
|
console.table(
|
||
|
frameTimeMedianDifferenceSorted
|
||
|
.map(tableDataFromComparisonDataObject)
|
||
|
.slice(0,3)
|
||
|
);
|
||
|
|
||
|
console.log('\nWorst 3 Individual SKP frame time median differences NOT in favor of the SIMD build');
|
||
|
console.table(
|
||
|
frameTimeMedianDifferenceSorted
|
||
|
.map(tableDataFromComparisonDataObject)
|
||
|
.reverse().slice(0,3)
|
||
|
);
|
||
|
|
||
|
function averageFromArray(array) {
|
||
|
return array.reduce((a, b) => a+b, 0) / array.length;
|
||
|
}
|
||
|
function medianFromArray(array) {
|
||
|
return array.sort((a,b) => a-b)[Math.floor(array.length/2)];
|
||
|
}
|
||
|
|
||
|
function tableDataFromComparisonDataObject({
|
||
|
skp_name,
|
||
|
frames_median_difference,
|
||
|
simd_frames_median,
|
||
|
release_frames_median
|
||
|
}) {
|
||
|
return {
|
||
|
'.SKP name': skp_name,
|
||
|
'release CanvasKit build (ms)': release_frames_median.toFixed(2),
|
||
|
'experimental_simd CanvasKit build (ms)': simd_frames_median.toFixed(2),
|
||
|
'difference (ms)': frames_median_difference.toFixed(2)
|
||
|
};
|
||
|
}
|