| #!/usr/bin/env node | |
| let defaults = | |
| {input: 'input.br', output: 'output.txt', test_iters: 0, test_repeat: 100}; | |
| /* Parse command line arguments. */ | |
| let argv = | |
| require('yargs') | |
| .usage('Usage: $0 -i file -o file') | |
| .option( | |
| 'input', | |
| {alias: 'i', default: defaults.input, describe: 'compressed file'}) | |
| .option('output', { | |
| alias: 'o', | |
| default: defaults.output, | |
| describe: 'decompressed file' | |
| }) | |
| .option('test_iters', { | |
| default: defaults.test_iters, | |
| describe: '# of times to run performance test' | |
| }) | |
| .option('test_repeat', { | |
| default: defaults.test_repeat, | |
| describe: '# of times to decompress file in performance test' | |
| }) | |
| .argv; | |
| /* Read input. */ | |
| const fs = require('fs'); | |
| data = fs.readFileSync(argv.input); | |
| if (!Buffer.isBuffer(data)) throw 'not a buffer'; | |
| const bytes = new Uint8Array(data); | |
| /* Load and map brotli decoder module. */ | |
| global.window = {}; | |
| require('./decode.js') | |
| const brotliDecode = window['BrotliDecode']; | |
| /* Load "performance" module. */ | |
| const {PerformanceObserver, performance} = require('perf_hooks'); | |
| /* Performance test. */ | |
| for (let i = 0; i < argv.test_iters; ++i) { | |
| const a = performance.now(); | |
| let result; | |
| for (let j = 0; j < argv.test_repeat; ++j) { | |
| result = brotliDecode(bytes); | |
| } | |
| const b = performance.now(); | |
| const total_length = argv.test_repeat * result.length / (1024 * 1024); | |
| const total_time = (b - a) / 1000; | |
| console.log( | |
| total_length + 'MB / ' + total_time + | |
| 's = ' + (total_length / total_time) + 'MB/s'); | |
| } | |
| /* Decode and write output file. */ | |
| fs.writeFileSync(argv.output, new Buffer(brotliDecode(bytes))); |