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