fs: replace regexp with function
Replacing the path separator-finding regexp with a custom function results in a measurable improvement in performance. PR-URL: https://github.com/nodejs/node/pull/10789 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
This commit is contained in:
parent
34c9fc2e4e
commit
1c3df96570
53
lib/fs.js
53
lib/fs.js
@ -1478,12 +1478,6 @@ fs.unwatchFile = function(filename, listener) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// Regexp that finds the next portion of a (partial) path
|
|
||||||
// result is [base_with_slash, base], e.g. ['somedir/', 'somedir']
|
|
||||||
const nextPartRe = isWindows ?
|
|
||||||
/(.*?)(?:[/\\]+|$)/g :
|
|
||||||
/(.*?)(?:[/]+|$)/g;
|
|
||||||
|
|
||||||
// Regex to find the device root, including trailing slash. E.g. 'c:\\'.
|
// Regex to find the device root, including trailing slash. E.g. 'c:\\'.
|
||||||
const splitRootRe = isWindows ?
|
const splitRootRe = isWindows ?
|
||||||
/^(?:[a-zA-Z]:|[\\/]{2}[^\\/]+[\\/][^\\/]+)?[\\/]*/ :
|
/^(?:[a-zA-Z]:|[\\/]{2}[^\\/]+[\\/][^\\/]+)?[\\/]*/ :
|
||||||
@ -1500,6 +1494,21 @@ function encodeRealpathResult(result, options) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Finds the next portion of a (partial) path, up to the next path delimiter
|
||||||
|
var nextPart;
|
||||||
|
if (isWindows) {
|
||||||
|
nextPart = function nextPart(p, i) {
|
||||||
|
for (; i < p.length; ++i) {
|
||||||
|
const ch = p.charCodeAt(i);
|
||||||
|
if (ch === 92/*'\'*/ || ch === 47/*'/'*/)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
nextPart = function nextPart(p, i) { return p.indexOf('/', i); };
|
||||||
|
}
|
||||||
|
|
||||||
fs.realpathSync = function realpathSync(p, options) {
|
fs.realpathSync = function realpathSync(p, options) {
|
||||||
options = getOptions(options, {});
|
options = getOptions(options, {});
|
||||||
handleError((p = getPathFromURL(p)));
|
handleError((p = getPathFromURL(p)));
|
||||||
@ -1544,12 +1553,18 @@ fs.realpathSync = function realpathSync(p, options) {
|
|||||||
// NB: p.length changes.
|
// NB: p.length changes.
|
||||||
while (pos < p.length) {
|
while (pos < p.length) {
|
||||||
// find the next part
|
// find the next part
|
||||||
nextPartRe.lastIndex = pos;
|
var result = nextPart(p, pos);
|
||||||
var result = nextPartRe.exec(p);
|
|
||||||
previous = current;
|
previous = current;
|
||||||
current += result[0];
|
if (result === -1) {
|
||||||
base = previous + result[1];
|
var last = p.slice(pos);
|
||||||
pos = nextPartRe.lastIndex;
|
current += last;
|
||||||
|
base = previous + last;
|
||||||
|
pos = p.length;
|
||||||
|
} else {
|
||||||
|
current += p.slice(pos, result + 1);
|
||||||
|
base = previous + p.slice(pos, result);
|
||||||
|
pos = result + 1;
|
||||||
|
}
|
||||||
|
|
||||||
// continue if not a symlink
|
// continue if not a symlink
|
||||||
if (knownHard[base] || (cache && cache.get(base) === base)) {
|
if (knownHard[base] || (cache && cache.get(base) === base)) {
|
||||||
@ -1658,12 +1673,18 @@ fs.realpath = function realpath(p, options, callback) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// find the next part
|
// find the next part
|
||||||
nextPartRe.lastIndex = pos;
|
var result = nextPart(p, pos);
|
||||||
var result = nextPartRe.exec(p);
|
|
||||||
previous = current;
|
previous = current;
|
||||||
current += result[0];
|
if (result === -1) {
|
||||||
base = previous + result[1];
|
var last = p.slice(pos);
|
||||||
pos = nextPartRe.lastIndex;
|
current += last;
|
||||||
|
base = previous + last;
|
||||||
|
pos = p.length;
|
||||||
|
} else {
|
||||||
|
current += p.slice(pos, result + 1);
|
||||||
|
base = previous + p.slice(pos, result);
|
||||||
|
pos = result + 1;
|
||||||
|
}
|
||||||
|
|
||||||
// continue if not a symlink
|
// continue if not a symlink
|
||||||
if (knownHard[base]) {
|
if (knownHard[base]) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user