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