"use strict"; var fs = require("fs"), path = require("path"); // A profiling stub to measure encoding / decoding performance using benchmark data. var commands = ["encode", "decode", "encode-browser", "decode-browser", "fromjson"]; if (commands.indexOf(process.argv[2]) < 0) { // 0: node, 1: prof.js process.stderr.write("usage: " + path.basename(process.argv[1]) + " <" + commands.join("|") + "> [iterations=10000000]\n"); return; } // Spin up a node process with profiling enabled and process the generated log if (process.execArgv.indexOf("--prof") < 0) { process.stdout.write("cleaning up old logs ...\n"); var child_process = require("child_process"); var logRe = /^isolate-[0-9A-F]+-v8\.log$/; fs.readdirSync(process.cwd()).forEach(function readdirSync_it(file) { if (logRe.test(file)) fs.unlink(file); }); process.stdout.write("generating profile (may take a while) ...\n"); child_process.execSync("node --prof --trace-deopt " + process.execArgv.join(" ") + " " + process.argv.slice(1).join(" "), { cwd: process.cwd(), stdio: "inherit" }); process.stdout.write("processing profile ...\n"); fs.readdirSync(process.cwd()).forEach(function readdirSync_it(file) { if (logRe.test(file)) { child_process.execSync("node --prof-process " + file, { cwd: process.cwd(), stdio: "inherit" }); // fs.unlink(file); } }); process.stdout.write("done.\n"); return; } // Actual profiling code var protobuf = require(".."); // protobuf.util.codegen.verbose = true; var root, json; if (process.argv[2] === "fromjson") { json = require("../tests/data/test.json"); if (process.argv.indexOf("--resolve") < 0) for (var k = 0; k < 10000; ++k) protobuf.Root.fromJSON(json); else for (var l = 0; l < 10000; ++l) protobuf.Root.fromJSON(json).resolveAll(); return; } var Test, data, count; if (process.argv.indexOf("--alt") < 0) { root = protobuf.parse(fs.readFileSync(require.resolve("../bench/data/bench.proto")).toString("utf8")).root; Test = root.lookup("Test"); json = JSON.stringify(root); data = require("../bench/data/bench.json"); count = 10000000; process.stdout.write("bench.proto"); } else { root = protobuf.parse(fs.readFileSync(require.resolve("../tests/data/mapbox/vector_tile.proto")).toString("utf8")).root; Test = root.lookup("vector_tile.Tile"); data = Test.decode(fs.readFileSync(require.resolve("../tests/data/mapbox/vector_tile.bin"))); count = 1000; process.stdout.write("vector_tile.proto"); } if (process.argv.length > 3 && /^\d+$/.test(process.argv[3])) count = parseInt(process.argv[3], 10); process.stdout.write(" x " + count + "\n"); function setupBrowser() { protobuf.Writer.create = function create_browser() { return new protobuf.Writer(); }; protobuf.Reader.create = function create_browser(buf) { return new protobuf.Reader(buf); }; } switch (process.argv[2]) { case "encode-browser": setupBrowser(); // eslint-disable-next-line no-fallthrough case "encode": for (var i = 0; i < count; ++i) Test.encode(data).finish(); break; case "decode-browser": setupBrowser(); // eslint-disable-next-line no-fallthrough case "decode": var buf = Test.encode(data).finish(); for (var j = 0; j < count; ++j) Test.decode(buf); break; }