skia2/tools/perf-canvaskit-puppeteer/skp_data_prep.js

110 lines
4.1 KiB
JavaScript
Raw Normal View History

/**
* 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)
};
}