diff --git a/bench/.eslintrc b/bench/.eslintrc new file mode 100644 index 00000000000..109398c8edd --- /dev/null +++ b/bench/.eslintrc @@ -0,0 +1,11 @@ +{ + "extends": "../.eslintrc", + "env": { + "browser": true + }, + "globals": { + "suite": true, + "benchmark": true, + "Plotly": true + } +} diff --git a/bench/karma.conf.js b/bench/karma.conf.js new file mode 100644 index 00000000000..255a3c8ae6a --- /dev/null +++ b/bench/karma.conf.js @@ -0,0 +1,88 @@ +/* eslint-env node*/ + +var pkg = require('../package.json'); +var execSync = require('child_process').execSync; + +function func(config) { + func.defaultConfig.logLevel = config.LOG_INFO; + func.defaultConfig.browserConsoleLogOptions = {level: 'log'}; + config.set(func.defaultConfig); +} + +func.defaultConfig = { + + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '.', + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ['browserify', 'benchmark'], + reporters: ['benchmark', 'benchmark-json'], + + // list of files / patterns to load in the browser + files: [ + '../build/plotly.js', + './suites/*_bench.js' + ], + + preprocessors: { + './suites/*_bench.js': ['browserify'] + }, + + browserify: { + transform: ['../tasks/util/shortcut_paths.js'], + extensions: ['.js'], + debug: true + }, + + benchmarkJsonReporter: { + pathToJson: '../dist/benchmarks.json', + formatOutput: function(results) { + return { + meta: { + version: pkg.version, + commit: execSync('git rev-parse HEAD').toString().replace('\n', ''), + date: (new Date()).toTimeString() + }, + results: results + }; + } + }, + + // web server port + port: 9876, + + // enable / disable colors in the output (reporters and logs) + colors: true, + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: false, + + // if true, Karma captures browsers, runs the tests and exits + singleRun: true, + + // how long will Karma wait for a message from a browser before disconnecting (30 ms) + browserNoActivityTimeout: 30000, + + // start these browsers + // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher + browsers: ['Chrome_WindowSized'], + + // custom browser options + // + // window-size values came from observing default size + // + // '--ignore-gpu-blacklist' allow to test WebGL on CI (!!!) + customLaunchers: { + Chrome_WindowSized: { + base: 'Chrome', + flags: ['--window-size=1035,617', '--ignore-gpu-blacklist'] + }, + Firefox_WindowSized: { + base: 'Firefox', + flags: ['--width=1035', '--height=617'] + } + } +}; + +module.exports = func; diff --git a/bench/suites/lib_bench.js b/bench/suites/lib_bench.js new file mode 100644 index 00000000000..8978f9ab08a --- /dev/null +++ b/bench/suites/lib_bench.js @@ -0,0 +1,16 @@ +var Lib = require('@src/lib'); + +suite('Benchmark: lib functions', function() { + + benchmark('Lib.cleanNumber', function() { + [ + 0, 1, 2, 1234.567, + -1, -100, -999.999, + Number.MAX_VALUE, Number.MIN_VALUE, Number.EPSILON, + -Number.MAX_VALUE, -Number.MIN_VALUE, -Number.EPSILON, + NaN, Infinity, -Infinity, null, undefined, new Date(), '', + ' ', '\t', '2\t2', '2%2', '2$2', {1: 2}, [1], ['1'], {}, [] + ] + .forEach(Lib.cleanNumber); + }); +}); diff --git a/bench/suites/plot_big_data_bench.js b/bench/suites/plot_big_data_bench.js new file mode 100644 index 00000000000..02131bbfd7a --- /dev/null +++ b/bench/suites/plot_big_data_bench.js @@ -0,0 +1,36 @@ +var suiteOpts = { + defer: true +}; + +var benchmarkOpts = { + setup: function() { + this.gd = document.createElement('div'); + document.body.appendChild(this.gd); + }, + teardown: function() { + Plotly.purge(this.gd); + document.body.removeChild(this.gd); + } +}; + +suite('Benchmark: plotting large data', function() { + var N = 1e5; + + var trace = { + type: 'scattergl', + x: new Array(N), + y: new Array(N) + }; + + for(var i = 0; i < N; i++) { + trace.x[i] = Math.random(); + trace.y[i] = Math.random(); + } + + benchmark('scattergl 1e5 pts', function(deferred) { + Plotly.plot(this.gd, [trace]).then(function() { + deferred.resolve(); + }); + }, benchmarkOpts); + +}, suiteOpts); diff --git a/bench/suites/plot_mock_bench.js b/bench/suites/plot_mock_bench.js new file mode 100644 index 00000000000..c6e06848ea1 --- /dev/null +++ b/bench/suites/plot_mock_bench.js @@ -0,0 +1,35 @@ +var suiteOpts = { + defer: true +}; + +var benchmarkOpts = { + setup: function() { + this.gd = document.createElement('div'); + document.body.appendChild(this.gd); + }, + + teardown: function() { + Plotly.purge(this.gd); + document.body.removeChild(this.gd); + } +}; + +suite('Benchmark: plotting image mocks', function() { + + benchmark('17.json', function(deferred) { + var mock = require('@mocks/17.json'); + + Plotly.plot(this.gd, mock).then(function() { + deferred.resolve(); + }); + }, benchmarkOpts); + + benchmark('contour_match_edges', function(deferred) { + var mock = require('@mocks/contour_match_edges.json'); + + Plotly.plot(this.gd, mock).then(function() { + deferred.resolve(); + }); + }, benchmarkOpts); + +}, suiteOpts); diff --git a/dist/benchmarks.json b/dist/benchmarks.json new file mode 100644 index 00000000000..e8fb3e91586 --- /dev/null +++ b/dist/benchmarks.json @@ -0,0 +1,169 @@ +{ + "meta": { + "version": "1.34.0", + "commit": "086729780205212fb55c33f27b5a845692f94593", + "date": "15:09:07 GMT-0500 (EST)" + }, + "results": [ + { + "fullName": "Benchmark: lib function--Lib.cleanNumber-Chrome 64.0.3282 (Linux 0.0.0)", + "browser": "Chrome 64.0.3282 (Linux 0.0.0)", + "suite": "Benchmark: lib functions", + "name": "Lib.cleanNumber", + "count": 62762, + "cycles": 6, + "hz": 803408.2211279911, + "hzDeviation": 31147.317130974046, + "mean": 0.000001244697245686623, + "deviation": 4.9312117524292397e-8, + "variance": 2.431684934729625e-15, + "moe": 1.1988174201948626e-8, + "rme": 0.9631397710160021, + "sem": 6.116415409157463e-9, + "sample": [ + 0.0000012602497585885203, + 0.0000013093503985335276, + 0.0000012766166385701893, + 0.0000012111425111021396, + 0.0000012272910779168348, + 0.0000012111425111021396, + 0.0000012434396447315301, + 0.0000012272910779168348, + 0.0000012272910779168348, + 0.0000012595882115462252, + 0.0000012757367783609204, + 0.0000012918853451756157, + 0.0000012918853451756157, + 0.0000012595882115462252, + 0.0000013403310456197013, + 0.000001404925312878482, + 0.0000015179652805813483, + 0.0000012918853451756157, + 0.0000012272910779168348, + 0.0000012434396447315301, + 0.0000012434396447315301, + 0.0000012111425111021396, + 0.0000012272910779168348, + 0.0000012434396447315301, + 0.0000012111425111021396, + 0.0000012434396447315301, + 0.0000012587234313756732, + 0.000001242790223383576, + 0.0000012268570153914788, + 0.0000012109238073993817, + 0.0000012109238073993817, + 0.000001242790223383576, + 0.000001242790223383576, + 0.000001242790223383576, + 0.000001242790223383576, + 0.0000012109238073993817, + 0.000001242790223383576, + 0.0000012268570153914788, + 0.0000012268570153914788, + 0.0000012268570153914788, + 0.0000012109238073993817, + 0.0000012109238073993817, + 0.000001242790223383576, + 0.000001242790223383576, + 0.0000012109238073993817, + 0.0000012587234313756732, + 0.0000012268570153914788, + 0.0000012109238073993817, + 0.0000012109238073993817, + 0.000001242790223383576, + 0.0000012268570153914788, + 0.0000012109238073993817, + 0.0000012109238073993817, + 0.0000012109238073993817, + 0.0000012268570153914788, + 0.0000012109238073993817, + 0.000001242790223383576, + 0.0000013065230553519646, + 0.0000012109238073993817, + 0.0000012109238073993817, + 0.0000012109238073993817, + 0.000001242790223383576, + 0.0000012268570153914788, + 0.0000012587234313756732, + 0.0000011949905994072847 + ] + }, + { + "fullName": "Benchmark: plotting image mock--17.j-on-Chrome 64.0.3282 (Linux 0.0.0)", + "browser": "Chrome 64.0.3282 (Linux 0.0.0)", + "suite": "Benchmark: plotting image mocks", + "name": "17.json", + "count": 2, + "cycles": 2, + "hz": 4.085338175215615, + "hzDeviation": 6.425304603128786, + "mean": 0.24477777777777782, + "deviation": 0.3180914875384823, + "variance": 0.10118219444444447, + "moe": 0.24450632342124673, + "rme": 99.8891017154435, + "sem": 0.10603049584616077, + "sample": [ + 0.099, + 0.0785, + 0.0535, + 0.0555, + 0.0945, + 0.1165, + 0.1915, + 0.5105, + 1.0035 + ] + }, + { + "fullName": "Benchmark: plotting image mock--contour_match_edge--Chrome 64.0.3282 (Linux 0.0.0)", + "browser": "Chrome 64.0.3282 (Linux 0.0.0)", + "suite": "Benchmark: plotting image mocks", + "name": "contour_match_edges", + "count": 2, + "cycles": 2, + "hz": 2.142966477881525, + "hzDeviation": 4.4391330743125605, + "mean": 0.4666428571428571, + "deviation": 0.522579875416645, + "variance": 0.27308972619047617, + "moe": 0.48332318680019437, + "rme": 103.57453872956867, + "sem": 0.19751662721707983, + "sample": [ + 0.096, + 0.09, + 0.133, + 0.269, + 0.412, + 0.735, + 1.5315 + ] + }, + { + "fullName": "Benchmark: plotting large data--cattergl 1e5 pt--Chrome 64.0.3282 (Linux 0.0.0)", + "browser": "Chrome 64.0.3282 (Linux 0.0.0)", + "suite": "Benchmark: plotting large data", + "name": "scattergl 1e5 pts", + "count": 1, + "cycles": 1, + "hz": 1.1568335812262438, + "hzDeviation": 0.6908011723020978, + "mean": 0.8644285714285713, + "deviation": 0.42061853547002936, + "variance": 0.17691995238095234, + "moe": 0.3890212779979738, + "rme": 45.00328781996062, + "sem": 0.1589788630968426, + "sample": [ + 0.569, + 0.443, + 1.434, + 1.132, + 1.329, + 0.489, + 0.655 + ] + } + ] +} diff --git a/package-lock.json b/package-lock.json index a984a484240..1770bb777c1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -787,6 +787,16 @@ "tweetnacl": "0.14.5" } }, + "benchmark": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.3.tgz", + "integrity": "sha1-4Q5A5NU9Dhydd6g0/eWTmU3Kfww=", + "dev": true, + "requires": { + "lodash": "4.17.5", + "platform": "1.3.3" + } + }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -5375,6 +5385,15 @@ "ansi-regex": "2.1.1" } }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, "has-binary2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz", @@ -6393,6 +6412,12 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, + "json3": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.2.6.tgz", + "integrity": "sha1-9u/JPAagTemuxTBT3yVZuxniA4s=", + "dev": true + }, "jsonfile": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", @@ -6665,6 +6690,424 @@ } } }, + "karma-benchmark": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/karma-benchmark/-/karma-benchmark-0.7.1.tgz", + "integrity": "sha1-IeIAcbczSFMgj3xZTxwf/ibozlo=", + "dev": true, + "requires": { + "benchmark": "2.1.3", + "karma": "1.3.0", + "lodash": "4.17.4", + "platform": "1.3.3" + }, + "dependencies": { + "accepts": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.1.4.tgz", + "integrity": "sha1-1xyW99QdD+2iw4zRToonwEFY30o=", + "dev": true, + "requires": { + "mime-types": "2.0.14", + "negotiator": "0.4.9" + } + }, + "after": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", + "integrity": "sha1-q11PuIP1loFtNRX495HAr0ht1ic=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "dev": true + }, + "base64-arraybuffer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz", + "integrity": "sha1-R030qfLaJOBd8xWMOx2zw81GoVQ=", + "dev": true + }, + "base64id": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", + "integrity": "sha1-As4P3u4M709ACA4ec+g08LG/zj8=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "engine.io": { + "version": "1.6.10", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.6.10.tgz", + "integrity": "sha1-+H2E4b0h0aLsf43u8MYgVKzfsno=", + "dev": true, + "requires": { + "accepts": "1.1.4", + "base64id": "0.1.0", + "debug": "2.2.0", + "engine.io-parser": "1.2.4", + "ws": "1.0.1" + } + }, + "engine.io-client": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.6.9.tgz", + "integrity": "sha1-HWrUgEilCDyVCWlDsp0279shJAE=", + "dev": true, + "requires": { + "component-emitter": "1.1.2", + "component-inherit": "0.0.3", + "debug": "2.2.0", + "engine.io-parser": "1.2.4", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.1", + "parseqs": "0.0.2", + "parseuri": "0.0.4", + "ws": "1.0.1", + "xmlhttprequest-ssl": "1.5.1", + "yeast": "0.1.2" + } + }, + "engine.io-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.2.4.tgz", + "integrity": "sha1-4Il7C/FOeS1M0qWVBVORnFaUjEI=", + "dev": true, + "requires": { + "after": "0.8.1", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.2", + "blob": "0.0.4", + "has-binary": "0.1.6", + "utf8": "2.1.0" + }, + "dependencies": { + "has-binary": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", + "integrity": "sha1-JTJvOc+k9hath4eJTjryz7x7bhA=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "karma": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-1.3.0.tgz", + "integrity": "sha1-srlOj0mfrdAGnVT5rvSk1I7FzB8=", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "body-parser": "1.18.2", + "chokidar": "1.7.0", + "colors": "1.1.2", + "combine-lists": "1.0.1", + "connect": "3.6.6", + "core-js": "2.5.3", + "di": "0.0.1", + "dom-serialize": "2.2.1", + "expand-braces": "0.1.2", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "http-proxy": "1.16.2", + "isbinaryfile": "3.0.2", + "lodash": "3.10.1", + "log4js": "0.6.38", + "mime": "1.6.0", + "minimatch": "3.0.4", + "optimist": "0.6.1", + "qjobs": "1.2.0", + "range-parser": "1.2.0", + "rimraf": "2.6.2", + "socket.io": "1.4.7", + "source-map": "0.5.7", + "tmp": "0.0.28", + "useragent": "2.3.0" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "log4js": { + "version": "0.6.38", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", + "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "semver": "4.3.6" + } + }, + "mime-db": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", + "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=", + "dev": true + }, + "mime-types": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", + "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=", + "dev": true, + "requires": { + "mime-db": "1.12.0" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "negotiator": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.9.tgz", + "integrity": "sha1-kuRrbbU8fkIe1koryU8IvnYw3z8=", + "dev": true + }, + "parseqs": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.2.tgz", + "integrity": "sha1-nf5wss3aw4i95PNbHyQPpYrb5sc=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseuri": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.4.tgz", + "integrity": "sha1-gGWCo5iH4eoY3V4v4OAZAiaOk1A=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "socket.io": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.4.7.tgz", + "integrity": "sha1-krf3y4jFeX1NruJ5/oB12+bT+hw=", + "dev": true, + "requires": { + "debug": "2.2.0", + "engine.io": "1.6.10", + "has-binary": "0.1.7", + "socket.io-adapter": "0.4.0", + "socket.io-client": "1.4.6", + "socket.io-parser": "2.2.6" + } + }, + "socket.io-adapter": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.4.0.tgz", + "integrity": "sha1-+5+CqxqmUpC/csNleVW5MKmRok8=", + "dev": true, + "requires": { + "debug": "2.2.0", + "socket.io-parser": "2.2.2" + }, + "dependencies": { + "benchmark": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz", + "integrity": "sha1-Lx4vpMNZ8REiqhgwgiGOlX45DHM=", + "dev": true + }, + "socket.io-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.2.tgz", + "integrity": "sha1-PXr2tkSX6Va32f53X5mXFgJ/lBc=", + "dev": true, + "requires": { + "benchmark": "1.0.0", + "component-emitter": "1.1.2", + "debug": "0.7.4", + "isarray": "0.0.1", + "json3": "3.2.6" + }, + "dependencies": { + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", + "dev": true + } + } + } + } + }, + "socket.io-client": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.4.6.tgz", + "integrity": "sha1-SbC6U379FbgpfIQBbmQuHHx1LD0=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.0", + "debug": "2.2.0", + "engine.io-client": "1.6.9", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.4", + "socket.io-parser": "2.2.6", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.0.tgz", + "integrity": "sha1-zNETqGOI0GSC0D3j/H35hSa6jv4=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.6.tgz", + "integrity": "sha1-ON/WHfUNz4qx2eIJEyK/kCuii5k=", + "dev": true, + "requires": { + "benchmark": "1.0.0", + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "benchmark": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz", + "integrity": "sha1-Lx4vpMNZ8REiqhgwgiGOlX45DHM=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + } + } + }, + "tmp": { + "version": "0.0.28", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.28.tgz", + "integrity": "sha1-Fyc1t/YU6nrzlmT6hM8N5OUV0SA=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "ws": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.0.1.tgz", + "integrity": "sha1-fQsqLljN3YGQOcKcneZQReGzEOk=", + "dev": true, + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + }, + "xmlhttprequest-ssl": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.1.tgz", + "integrity": "sha1-O3dB/qSoZnWXbpCNKW1ERZYfqmc=", + "dev": true + } + } + }, + "karma-benchmark-json-reporter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/karma-benchmark-json-reporter/-/karma-benchmark-json-reporter-1.0.1.tgz", + "integrity": "sha512-mbt+5HJFN2nhfBIeT0x9yoq07T1Qx4Dlmqlc92TBYY73UNHty/9npG/wd9Er7M1baCrwG8RtO4DBeSJRQKeSeQ==", + "dev": true + }, + "karma-benchmarkjs-reporter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/karma-benchmarkjs-reporter/-/karma-benchmarkjs-reporter-1.0.0.tgz", + "integrity": "sha1-2Y0AMpQsbil0bZr+/C2rFinttk4=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "lodash": "4.17.5", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, "karma-browserify": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/karma-browserify/-/karma-browserify-5.2.0.tgz", @@ -8657,6 +9100,12 @@ "wordwrap": "1.0.0" } }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, "ora": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ora/-/ora-1.4.0.tgz", @@ -8883,6 +9332,15 @@ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", "dev": true }, + "parsejson": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.1.tgz", + "integrity": "sha1-mxDGwNglq1ieaFFTgm3go7oni8w=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, "parseqs": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", @@ -9068,6 +9526,12 @@ "uniq": "1.0.1" } }, + "platform": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.3.tgz", + "integrity": "sha1-ZGx3ARiZhwtqCQPnXpl+jlHadGE=", + "dev": true + }, "plur": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", @@ -11968,6 +12432,12 @@ "tmp": "0.0.33" } }, + "utf8": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.0.tgz", + "integrity": "sha1-DP7FyAUtRKI+OqqQgQToB1+V39U=", + "dev": true + }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", diff --git a/package.json b/package.json index ad339fda044..c790854628a 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "start-image_viewer": "node devtools/image_viewer/server.js", "start": "npm run start-test_dashboard", "baseline": "node tasks/baseline.js", + "bench": "karma start bench/karma.conf.js", "preversion": "check-node-version --node 8 --npm 5 && npm-link-check && npm ls --prod", "version": "npm run build && git add -A dist src build", "postversion": "node -e \"console.log('Version bumped and committed. If ok, run: git push && git push --tags')\"" @@ -131,6 +132,9 @@ "jsdom": "^11.6.2", "karma": "^2.0.0", "karma-browserify": "^5.2.0", + "karma-benchmark": "^0.7.1", + "karma-benchmark-json-reporter": "^1.0.1", + "karma-benchmarkjs-reporter": "^1.0.0", "karma-chrome-launcher": "^2.0.0", "karma-coverage": "^1.0.0", "karma-firefox-launcher": "^1.0.1",