path: improve POSIX path.join() performance
Performance gains are ~4x (~1.5us), but still much slower than a naive approach. There is some duplicate work done between join(), normalize() and normalizeArray() so additional optimizations are possible. Note that this only improves the POSIX implementation. Thanks to @isaacs and @othiym23 for helping with this optimization. Signed-off-by: Trevor Norris <trev.norris@gmail.com>
This commit is contained in:
parent
cdde9a386a
commit
b9bec2031e
31
lib/path.js
31
lib/path.js
@ -348,12 +348,17 @@ if (isWindows) {
|
||||
// posix version
|
||||
exports.normalize = function(path) {
|
||||
var isAbsolute = exports.isAbsolute(path),
|
||||
trailingSlash = path.substr(-1) === '/';
|
||||
trailingSlash = path[path.length - 1] === '/',
|
||||
segments = path.split('/'),
|
||||
nonEmptySegments = [];
|
||||
|
||||
// Normalize the path
|
||||
path = normalizeArray(path.split('/').filter(function(p) {
|
||||
return !!p;
|
||||
}), !isAbsolute).join('/');
|
||||
for (var i = 0; i < segments.length; i++) {
|
||||
if (segments[i]) {
|
||||
nonEmptySegments.push(segments[i]);
|
||||
}
|
||||
}
|
||||
path = normalizeArray(nonEmptySegments, !isAbsolute).join('/');
|
||||
|
||||
if (!path && !isAbsolute) {
|
||||
path = '.';
|
||||
@ -372,13 +377,21 @@ if (isWindows) {
|
||||
|
||||
// posix version
|
||||
exports.join = function() {
|
||||
var paths = Array.prototype.slice.call(arguments, 0);
|
||||
return exports.normalize(paths.filter(function(p, index) {
|
||||
if (!util.isString(p)) {
|
||||
var path = '';
|
||||
for (var i = 0; i < arguments.length; i++) {
|
||||
var segment = arguments[i];
|
||||
if (!util.isString(segment)) {
|
||||
throw new TypeError('Arguments to path.join must be strings');
|
||||
}
|
||||
return p;
|
||||
}).join('/'));
|
||||
if (segment) {
|
||||
if (!path) {
|
||||
path += segment;
|
||||
} else {
|
||||
path += '/' + segment;
|
||||
}
|
||||
}
|
||||
}
|
||||
return exports.normalize(path);
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user