benchmark: add remaining path benchmarks & optimize
authorNathan Woltman <nwoltman@outlook.com>
Sat, 4 Jul 2015 19:50:07 +0000 (15:50 -0400)
committerBrendan Ashworth <brendan.ashworth@me.com>
Mon, 27 Jul 2015 05:17:41 +0000 (22:17 -0700)
As a follow-up to 0d15161, this commit adds benchmarks for the rest
of the path functions and also forces V8 to optimize the functions
before starting the benchmark test.

PR-URL: https://github.com/nodejs/io.js/pull/2103
Reviewed-By: Brendan Ashworth <brendan.ashworth@me.com>
benchmark/path/basename.js [new file with mode: 0644]
benchmark/path/dirname.js [new file with mode: 0644]
benchmark/path/extname.js [new file with mode: 0644]
benchmark/path/format.js
benchmark/path/isAbsolute.js
benchmark/path/join.js
benchmark/path/normalize.js
benchmark/path/parse.js [new file with mode: 0644]
benchmark/path/relative.js
benchmark/path/resolve.js

diff --git a/benchmark/path/basename.js b/benchmark/path/basename.js
new file mode 100644 (file)
index 0000000..57d9492
--- /dev/null
@@ -0,0 +1,26 @@
+var common = require('../common.js');
+var path = require('path');
+var v8 = require('v8');
+
+var bench = common.createBenchmark(main, {
+  type: ['win32', 'posix'],
+  n: [1e6],
+});
+
+function main(conf) {
+  var n = +conf.n;
+  var p = path[conf.type];
+
+  // Force optimization before starting the benchmark
+  p.basename('/foo/bar/baz/asdf/quux.html');
+  v8.setFlagsFromString('--allow_natives_syntax');
+  eval('%OptimizeFunctionOnNextCall(p.basename)');
+  p.basename('/foo/bar/baz/asdf/quux.html');
+
+  bench.start();
+  for (var i = 0; i < n; i++) {
+    p.basename('/foo/bar/baz/asdf/quux.html');
+    p.basename('/foo/bar/baz/asdf/quux.html', '.html');
+  }
+  bench.end(n);
+}
diff --git a/benchmark/path/dirname.js b/benchmark/path/dirname.js
new file mode 100644 (file)
index 0000000..e95adf2
--- /dev/null
@@ -0,0 +1,25 @@
+var common = require('../common.js');
+var path = require('path');
+var v8 = require('v8');
+
+var bench = common.createBenchmark(main, {
+  type: ['win32', 'posix'],
+  n: [1e6],
+});
+
+function main(conf) {
+  var n = +conf.n;
+  var p = path[conf.type];
+
+  // Force optimization before starting the benchmark
+  p.dirname('/foo/bar/baz/asdf/quux');
+  v8.setFlagsFromString('--allow_natives_syntax');
+  eval('%OptimizeFunctionOnNextCall(p.dirname)');
+  p.dirname('/foo/bar/baz/asdf/quux');
+
+  bench.start();
+  for (var i = 0; i < n; i++) {
+    p.dirname('/foo/bar/baz/asdf/quux');
+  }
+  bench.end(n);
+}
diff --git a/benchmark/path/extname.js b/benchmark/path/extname.js
new file mode 100644 (file)
index 0000000..c655ee7
--- /dev/null
@@ -0,0 +1,26 @@
+var common = require('../common.js');
+var path = require('path');
+var v8 = require('v8');
+
+var bench = common.createBenchmark(main, {
+  type: ['win32', 'posix'],
+  n: [1e6],
+});
+
+function main(conf) {
+  var n = +conf.n;
+  var p = path[conf.type];
+
+  // Force optimization before starting the benchmark
+  p.extname('index.html');
+  v8.setFlagsFromString('--allow_natives_syntax');
+  eval('%OptimizeFunctionOnNextCall(p.extname)');
+  p.extname('index.html');
+
+  bench.start();
+  for (var i = 0; i < n; i++) {
+    p.extname('index.html');
+    p.extname('index');
+  }
+  bench.end(n);
+}
index 02fb691..bc77f88 100644 (file)
@@ -1,5 +1,6 @@
 var common = require('../common.js');
 var path = require('path');
+var v8 = require('v8');
 
 var bench = common.createBenchmark(main, {
   type: ['win32', 'posix'],
@@ -23,6 +24,12 @@ function main(conf) {
     name : 'index'
   };
 
+  // Force optimization before starting the benchmark
+  p.format(test);
+  v8.setFlagsFromString('--allow_natives_syntax');
+  eval('%OptimizeFunctionOnNextCall(p.format)');
+  p.format(test);
+
   bench.start();
   for (var i = 0; i < n; i++) {
     p.format(test);
index c9489fe..d4c79b9 100644 (file)
@@ -1,5 +1,6 @@
 var common = require('../common.js');
 var path = require('path');
+var v8 = require('v8');
 
 var bench = common.createBenchmark(main, {
   type: ['win32', 'posix'],
@@ -13,6 +14,12 @@ function main(conf) {
     ? ['//server', 'C:\\baz\\..', 'bar\\baz', '.']
     : ['/foo/bar', '/baz/..', 'bar/baz', '.'];
 
+  // Force optimization before starting the benchmark
+  p.isAbsolute(tests[0]);
+  v8.setFlagsFromString('--allow_natives_syntax');
+  eval('%OptimizeFunctionOnNextCall(p.isAbsolute)');
+  p.isAbsolute(tests[0]);
+
   bench.start();
   for (var i = 0; i < n; i++) {
     runTests(p, tests);
index 54d02a6..58f4dc3 100644 (file)
@@ -1,5 +1,6 @@
 var common = require('../common.js');
 var path = require('path');
+var v8 = require('v8');
 
 var bench = common.createBenchmark(main, {
   type: ['win32', 'posix'],
@@ -10,6 +11,12 @@ function main(conf) {
   var n = +conf.n;
   var p = path[conf.type];
 
+  // Force optimization before starting the benchmark
+  p.join('/foo', 'bar', '', 'baz/asdf', 'quux', '..');
+  v8.setFlagsFromString('--allow_natives_syntax');
+  eval('%OptimizeFunctionOnNextCall(p.join)');
+  p.join('/foo', 'bar', '', 'baz/asdf', 'quux', '..');
+
   bench.start();
   for (var i = 0; i < n; i++) {
     p.join('/foo', 'bar', '', 'baz/asdf', 'quux', '..');
index 10ca230..6f7f05e 100644 (file)
@@ -1,5 +1,6 @@
 var common = require('../common.js');
 var path = require('path');
+var v8 = require('v8');
 
 var bench = common.createBenchmark(main, {
   type: ['win32', 'posix'],
@@ -10,6 +11,12 @@ function main(conf) {
   var n = +conf.n;
   var p = path[conf.type];
 
+  // Force optimization before starting the benchmark
+  p.normalize('/foo/bar//baz/asdf/quux/..');
+  v8.setFlagsFromString('--allow_natives_syntax');
+  eval('%OptimizeFunctionOnNextCall(p.normalize)');
+  p.normalize('/foo/bar//baz/asdf/quux/..');
+
   bench.start();
   for (var i = 0; i < n; i++) {
     p.normalize('/foo/bar//baz/asdf/quux/..');
diff --git a/benchmark/path/parse.js b/benchmark/path/parse.js
new file mode 100644 (file)
index 0000000..f3fbb2a
--- /dev/null
@@ -0,0 +1,28 @@
+var common = require('../common.js');
+var path = require('path');
+var v8 = require('v8');
+
+var bench = common.createBenchmark(main, {
+  type: ['win32', 'posix'],
+  n: [1e6],
+});
+
+function main(conf) {
+  var n = +conf.n;
+  var p = path[conf.type];
+  var test = conf.type === 'win32'
+    ? 'C:\\path\\dir\\index.html'
+    : '/home/user/dir/index.html';
+
+  // Force optimization before starting the benchmark
+  p.parse(test);
+  v8.setFlagsFromString('--allow_natives_syntax');
+  eval('%OptimizeFunctionOnNextCall(p.parse)');
+  p.parse(test);
+
+  bench.start();
+  for (var i = 0; i < n; i++) {
+    p.parse(test);
+  }
+  bench.end(n);
+}
index 3e12f8b..d61c396 100644 (file)
@@ -1,5 +1,6 @@
 var common = require('../common.js');
 var path = require('path');
+var v8 = require('v8');
 
 var bench = common.createBenchmark(main, {
   type: ['win32', 'posix'],
@@ -10,6 +11,12 @@ function main(conf) {
   var n = +conf.n;
   var runTest = conf.type === 'win32' ? runWin32Test : runPosixTest;
 
+  // Force optimization before starting the benchmark
+  runTest();
+  v8.setFlagsFromString('--allow_natives_syntax');
+  eval('%OptimizeFunctionOnNextCall(path[conf.type].relative)');
+  runTest();
+
   bench.start();
   for (var i = 0; i < n; i++) {
     runTest();
index ecf30f3..375e8b1 100644 (file)
@@ -1,5 +1,6 @@
 var common = require('../common.js');
 var path = require('path');
+var v8 = require('v8');
 
 var bench = common.createBenchmark(main, {
   type: ['win32', 'posix'],
@@ -10,6 +11,12 @@ function main(conf) {
   var n = +conf.n;
   var p = path[conf.type];
 
+  // Force optimization before starting the benchmark
+  p.resolve('foo/bar', '/tmp/file/', '..', 'a/../subfile');
+  v8.setFlagsFromString('--allow_natives_syntax');
+  eval('%OptimizeFunctionOnNextCall(p.resolve)');
+  p.resolve('foo/bar', '/tmp/file/', '..', 'a/../subfile');
+
   bench.start();
   for (var i = 0; i < n; i++) {
     p.resolve('foo/bar', '/tmp/file/', '..', 'a/../subfile');