benchmark: split path benchmarks

This commit splits each path benchmark into separate posix and
Windows benchmark files. This allows benchmarking (platform-)specific
inputs against specific platforms (only).

PR-URL: https://github.com/nodejs/node/pull/5123
Reviewed-By: Roman Reiss <me@silverwind.io>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Brian White 2016-02-05 22:23:29 -05:00 committed by James M Snell
parent 72d0f88215
commit e1348b0819
24 changed files with 592 additions and 152 deletions

View File

@ -0,0 +1,43 @@
var common = require('../common.js');
var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
pathext: [
'',
'/',
'/foo',
'/foo/.bar.baz',
['/foo/.bar.baz', '.baz'].join('|'),
'foo',
'foo/bar.',
['foo/bar.', '.'].join('|'),
'/foo/bar/baz/asdf/quux.html',
['/foo/bar/baz/asdf/quux.html', '.html'].join('|')
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path.posix;
var input = '' + conf.pathext;
var ext;
var extIdx = input.indexOf('|');
if (extIdx !== -1) {
ext = input.slice(extIdx + 1);
input = input.slice(0, extIdx);
}
// Force optimization before starting the benchmark
p.basename(input, ext);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.basename)');
p.basename(input, ext);
bench.start();
for (var i = 0; i < n; i++) {
p.basename(input, ext);
}
bench.end(n);
}

View File

@ -0,0 +1,43 @@
var common = require('../common.js');
var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
pathext: [
'',
'C:\\',
'C:\\foo',
'D:\\foo\\.bar.baz',
['E:\\foo\\.bar.baz','.baz'].join('|'),
'foo',
'foo\\bar.',
['foo\\bar.', '.'].join('|'),
'\\foo\\bar\\baz\\asdf\\quux.html',
['\\foo\\bar\\baz\\asdf\\quux.html', '.html'].join('|')
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path.win32;
var input = '' + conf.pathext;
var ext;
var extIdx = input.indexOf('|');
if (extIdx !== -1) {
ext = input.slice(extIdx + 1);
input = input.slice(0, extIdx);
}
// Force optimization before starting the benchmark
p.basename(input, ext);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.basename)');
p.basename(input, ext);
bench.start();
for (var i = 0; i < n; i++) {
p.basename(input, ext);
}
bench.end(n);
}

View File

@ -1,26 +0,0 @@
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);
}

View File

@ -3,23 +3,32 @@ var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
type: ['win32', 'posix'],
n: [1e6],
path: [
'',
'/',
'/foo',
'/foo/bar',
'foo',
'foo/bar',
'/foo/bar/baz/asdf/quux'
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path[conf.type];
var p = path.posix;
var input = '' + conf.path;
// Force optimization before starting the benchmark
p.dirname('/foo/bar/baz/asdf/quux');
p.dirname(input);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.dirname)');
p.dirname('/foo/bar/baz/asdf/quux');
p.dirname(input);
bench.start();
for (var i = 0; i < n; i++) {
p.dirname('/foo/bar/baz/asdf/quux');
p.dirname(input);
}
bench.end(n);
}

View File

@ -0,0 +1,34 @@
var common = require('../common.js');
var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
path: [
'',
'\\',
'\\foo',
'C:\\foo\\bar',
'foo',
'foo\\bar',
'D:\\foo\\bar\\baz\\asdf\\quux'
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path.win32;
var input = '' + conf.path;
// Force optimization before starting the benchmark
p.dirname(input);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.dirname)');
p.dirname(input);
bench.start();
for (var i = 0; i < n; i++) {
p.dirname(input);
}
bench.end(n);
}

View File

@ -0,0 +1,37 @@
var common = require('../common.js');
var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
path: [
'',
'/',
'/foo',
'foo/.bar.baz',
'index.html',
'index',
'foo/bar/..baz.quux',
'foo/bar/...baz.quux',
'/foo/bar/baz/asdf/quux',
'/foo/bar/baz/asdf/quux.foobarbazasdfquux'
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path.posix;
var input = '' + conf.path;
// Force optimization before starting the benchmark
p.extname(input);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.extname)');
p.extname(input);
bench.start();
for (var i = 0; i < n; i++) {
p.extname(input);
}
bench.end(n);
}

View File

@ -0,0 +1,37 @@
var common = require('../common.js');
var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
path: [
'',
'\\',
'C:\\foo',
'foo\\.bar.baz',
'index.html',
'index',
'foo\\bar\\..baz.quux',
'foo\\bar\\...baz.quux',
'D:\\foo\\bar\\baz\\asdf\\quux',
'\\foo\\bar\\baz\\asdf\\quux.foobarbazasdfquux'
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path.win32;
var input = '' + conf.path;
// Force optimization before starting the benchmark
p.extname(input);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.extname)');
p.extname(input);
bench.start();
for (var i = 0; i < n; i++) {
p.extname(input);
}
bench.end(n);
}

View File

@ -3,36 +3,33 @@ var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
type: ['win32', 'posix'],
n: [1e7],
props: [
['/', '/home/user/dir', 'index.html', '.html', 'index'].join('|')
],
n: [1e7]
});
function main(conf) {
var n = +conf.n;
var p = path[conf.type];
var test = conf.type === 'win32' ? {
root: 'C:\\',
dir: 'C:\\path\\dir',
base: 'index.html',
ext: '.html',
name: 'index'
} : {
root : '/',
dir : '/home/user/dir',
base : 'index.html',
ext : '.html',
name : 'index'
var p = path.posix;
var props = ('' + conf.props).split('|');
var obj = {
root: props[0] || '',
dir: props[1] || '',
base: props[2] || '',
ext: props[3] || '',
name: props[4] || '',
};
// Force optimization before starting the benchmark
p.format(test);
p.format(obj);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.format)');
p.format(test);
p.format(obj);
bench.start();
for (var i = 0; i < n; i++) {
p.format(test);
p.format(obj);
}
bench.end(n);
}

View File

@ -0,0 +1,35 @@
var common = require('../common.js');
var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
props: [
['C:\\', 'C:\\path\\dir', 'index.html', '.html', 'index'].join('|')
],
n: [1e7]
});
function main(conf) {
var n = +conf.n;
var p = path.win32;
var props = ('' + conf.props).split('|');
var obj = {
root: props[0] || '',
dir: props[1] || '',
base: props[2] || '',
ext: props[3] || '',
name: props[4] || '',
};
// Force optimization before starting the benchmark
p.format(obj);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.format)');
p.format(obj);
bench.start();
for (var i = 0; i < n; i++) {
p.format(obj);
}
bench.end(n);
}

View File

@ -3,24 +3,30 @@ var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
type: ['win32', 'posix'],
n: [1e6],
path: [
'',
'.',
'/foo/bar',
'/baz/..',
'bar/baz'
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path[conf.type];
var p = path.posix;
var input = '' + conf.path;
// Force optimization before starting the benchmark
p.extname('index.html');
p.isAbsolute(input);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.extname)');
p.extname('index.html');
eval('%OptimizeFunctionOnNextCall(p.isAbsolute)');
p.isAbsolute(input);
bench.start();
for (var i = 0; i < n; i++) {
p.extname('index.html');
p.extname('index');
p.isAbsolute(input);
}
bench.end(n);
}

View File

@ -0,0 +1,33 @@
var common = require('../common.js');
var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
path: [
'',
'.',
'//server',
'C:\\baz\\..',
'C:baz\\..',
'bar\\baz'
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path.win32;
var input = '' + conf.path;
// Force optimization before starting the benchmark
p.isAbsolute(input);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.isAbsolute)');
p.isAbsolute(input);
bench.start();
for (var i = 0; i < n; i++) {
p.isAbsolute(input);
}
bench.end(n);
}

View File

@ -1,34 +0,0 @@
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 tests = conf.type === 'win32'
? ['//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);
}
bench.end(n);
}
function runTests(p, tests) {
for (var i = 0; i < tests.length; i++) {
p.isAbsolute(tests[i]);
}
}

View File

@ -3,23 +3,26 @@ var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
type: ['win32', 'posix'],
n: [1e6],
paths: [
['/foo', 'bar', '', 'baz/asdf', 'quux', '..'].join('|')
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path[conf.type];
var p = path.posix;
var args = ('' + conf.paths).split('|');
// Force optimization before starting the benchmark
p.join('/foo', 'bar', '', 'baz/asdf', 'quux', '..');
p.join.apply(null, args);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.join)');
p.join('/foo', 'bar', '', 'baz/asdf', 'quux', '..');
p.join.apply(null, args);
bench.start();
for (var i = 0; i < n; i++) {
p.join('/foo', 'bar', '', 'baz/asdf', 'quux', '..');
p.join.apply(null, args);
}
bench.end(n);
}

View File

@ -0,0 +1,28 @@
var common = require('../common.js');
var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
paths: [
['C:\\foo', 'bar', '', 'baz\\asdf', 'quux', '..'].join('|')
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path.win32;
var args = ('' + conf.paths).split('|');
// Force optimization before starting the benchmark
p.join.apply(null, args);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.join)');
p.join.apply(null, args);
bench.start();
for (var i = 0; i < n; i++) {
p.join.apply(null, args);
}
bench.end(n);
}

View File

@ -0,0 +1,31 @@
var common = require('../common.js');
var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
path: [
'foo\\bar',
'C:\\foo',
'\\\\foo\\bar',
'\\\\?\\foo'
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path.win32;
var input = '' + conf.path;
// Force optimization before starting the benchmark
p._makeLong(input);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p._makeLong)');
p._makeLong(input);
bench.start();
for (var i = 0; i < n; i++) {
p._makeLong(input);
}
bench.end(n);
}

View File

@ -3,23 +3,31 @@ var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
type: ['win32', 'posix'],
n: [1e6],
path: [
'',
'.',
'/../',
'/foo',
'/foo/bar',
'/foo/bar//baz/asdf/quux/..'
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path[conf.type];
var p = path.posix;
var input = '' + conf.path;
// Force optimization before starting the benchmark
p.normalize('/foo/bar//baz/asdf/quux/..');
p.normalize(input);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.normalize)');
p.normalize('/foo/bar//baz/asdf/quux/..');
p.normalize(input);
bench.start();
for (var i = 0; i < n; i++) {
p.normalize('/foo/bar//baz/asdf/quux/..');
p.normalize(input);
}
bench.end(n);
}

View File

@ -0,0 +1,33 @@
var common = require('../common.js');
var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
path: [
'',
'.',
'C:\\..\\',
'C:\\foo',
'C:\\foo\\bar',
'C:\\foo\\bar\\\\baz\\asdf\\quux\\..'
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path.win32;
var input = '' + conf.path;
// Force optimization before starting the benchmark
p.normalize(input);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.normalize)');
p.normalize(input);
bench.start();
for (var i = 0; i < n; i++) {
p.normalize(input);
}
bench.end(n);
}

View File

@ -3,26 +3,32 @@ var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
type: ['win32', 'posix'],
n: [1e6],
path: [
'',
'/',
'/foo',
'/foo/bar.baz',
'foo/.bar.baz',
'foo/bar',
'/foo/bar/baz/asdf/.quux'
],
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';
var p = path.posix;
var input = '' + conf.path;
// Force optimization before starting the benchmark
p.parse(test);
p.parse(input);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.parse)');
p.parse(test);
p.parse(input);
bench.start();
for (var i = 0; i < n; i++) {
p.parse(test);
p.parse(input);
}
bench.end(n);
}

View File

@ -0,0 +1,35 @@
var common = require('../common.js');
var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
path: [
'',
'C:\\',
'C:\\foo',
'\\foo',
'E:\\foo\\bar.baz',
'foo\\.bar.baz',
'foo\\bar',
'\\foo\\bar\\baz\\asdf\\.quux'
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path.win32;
var input = '' + conf.path;
// Force optimization before starting the benchmark
p.parse(input);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.parse)');
p.parse(input);
bench.start();
for (var i = 0; i < n; i++) {
p.parse(input);
}
bench.end(n);
}

View File

@ -0,0 +1,40 @@
var common = require('../common.js');
var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
paths: [
['/data/orandea/test/aaa', '/data/orandea/impl/bbb'].join('|'),
['/', '/var'].join('|'),
['/', '/'].join('|'),
['/var', '/bin'].join('|'),
['/foo/bar/baz/quux', '/'].join('|'),
['/foo/bar/baz/quux', '/foo/bar/baz/quux'].join('|'),
['/foo/bar/baz/quux', '/var/log'].join('|')
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path.posix;
var from = '' + conf.paths;
var to = '';
var delimIdx = from.indexOf('|');
if (delimIdx > -1) {
to = from.slice(delimIdx + 1);
from = from.slice(0, delimIdx);
}
// Force optimization before starting the benchmark
p.relative(from, to);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.relative)');
p.relative(from, to);
bench.start();
for (var i = 0; i < n; i++) {
p.relative(from, to);
}
bench.end(n);
}

View File

@ -0,0 +1,38 @@
var common = require('../common.js');
var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
paths: [
['C:\\orandea\\test\\aaa', 'C:\\orandea\\impl\\bbb'].join('|'),
['C:\\', 'D:\\'].join('|'),
['C:\\foo\\bar\\baz', 'C:\\foo\\bar\\baz'].join('|'),
['C:\\foo\\BAR\\BAZ', 'C:\\foo\\bar\\baz'].join('|'),
['C:\\foo\\bar\\baz\\quux', 'C:\\'].join('|')
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path.win32;
var from = '' + conf.paths;
var to = '';
var delimIdx = from.indexOf('|');
if (delimIdx > -1) {
to = from.slice(delimIdx + 1);
from = from.slice(0, delimIdx);
}
// Force optimization before starting the benchmark
p.relative(from, to);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.relative)');
p.relative(from, to);
bench.start();
for (var i = 0; i < n; i++) {
p.relative(from, to);
}
bench.end(n);
}

View File

@ -1,33 +0,0 @@
var common = require('../common.js');
var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
type: ['win32', 'posix'],
n: [1e5],
});
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();
}
bench.end(n);
}
function runWin32Test() {
path.win32.relative('C:\\orandea\\test\\aaa', 'C:\\orandea\\impl\\bbb');
}
function runPosixTest() {
path.posix.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb');
}

View File

@ -3,23 +3,29 @@ var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
type: ['win32', 'posix'],
n: [1e6],
paths: [
'',
['', ''].join('|'),
['foo/bar', '/tmp/file/', '..', 'a/../subfile'].join('|'),
['a/b/c/', '../../..'].join('|')
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path[conf.type];
var p = path.posix;
var args = ('' + conf.paths).split('|');
// Force optimization before starting the benchmark
p.resolve('foo/bar', '/tmp/file/', '..', 'a/../subfile');
p.resolve.apply(null, args);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.resolve)');
p.resolve('foo/bar', '/tmp/file/', '..', 'a/../subfile');
p.resolve.apply(null, args);
bench.start();
for (var i = 0; i < n; i++) {
p.resolve('foo/bar', '/tmp/file/', '..', 'a/../subfile');
p.resolve.apply(null, args);
}
bench.end(n);
}

View File

@ -0,0 +1,31 @@
var common = require('../common.js');
var path = require('path');
var v8 = require('v8');
var bench = common.createBenchmark(main, {
paths: [
'',
['', ''].join('|'),
['c:/ignore', 'd:\\a/b\\c/d', '\\e.exe'].join('|'),
['c:/blah\\blah', 'd:/games', 'c:../a'].join('|')
],
n: [1e6]
});
function main(conf) {
var n = +conf.n;
var p = path.win32;
var args = ('' + conf.paths).split('|');
// Force optimization before starting the benchmark
p.resolve.apply(null, args);
v8.setFlagsFromString('--allow_natives_syntax');
eval('%OptimizeFunctionOnNextCall(p.resolve)');
p.resolve.apply(null, args);
bench.start();
for (var i = 0; i < n; i++) {
p.resolve.apply(null, args);
}
bench.end(n);
}