* Copyright (c) 2025 Huawei Technologies Co., Ltd.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
const csv = require('csv-parser');
const fs = require('fs');
const ss = require('simple-statistics');
const {generateFPSStatsConsoleOutput} = require('./lib/create-fps-stats');
let files = process.argv.slice(2);
let allStats = [];
const calculateFPS = filename => {
return new Promise((resolve, reject) => {
let fpsArr = [];
fs.createReadStream(filename)
.pipe(csv())
.on('data', row => fpsArr.push(parseFloat(row['UI FPS'])))
.on('end', () => {
console.log(`Processed file ${filename}`);
const fpsStats = {
mean: ss.mean(fpsArr),
standardDeviationInFps: ss.standardDeviation(fpsArr),
frameTime95thPercentileInFps: ss.quantileSorted(fpsArr, 0.05),
frameTime99thPercentileInFps: ss.quantileSorted(fpsArr, 0.01),
};
allStats.push(fpsStats);
resolve();
})
.on('error', reject);
});
};
Promise.all(files.map(calculateFPS))
.then(() => {
const averageFpsStats = {
mean: ss.mean(allStats.map(s => s.mean)),
standardDeviationInFps: ss.mean(
allStats.map(s => s.standardDeviationInFps),
),
frameTime95thPercentileInFps: ss.mean(
allStats.map(s => s.frameTime95thPercentileInFps),
),
frameTime99thPercentileInFps: ss.mean(
allStats.map(s => s.frameTime99thPercentileInFps),
),
};
console.log(generateFPSStatsConsoleOutput(averageFpsStats));
})
.catch(err => console.error(`Failed to process files: ${err}`));