-
Notifications
You must be signed in to change notification settings - Fork 29.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fs: two minor optimizations #14055
fs: two minor optimizations #14055
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -521,7 +521,6 @@ function tryStatSync(fd, isUserFd) { | |
} finally { | ||
if (threw && !isUserFd) fs.closeSync(fd); | ||
} | ||
return !threw; | ||
} | ||
|
||
function tryCreateBuffer(size, fd, isUserFd) { | ||
|
@@ -553,10 +552,11 @@ fs.readFileSync = function(path, options) { | |
var isUserFd = isFd(path); // file descriptor ownership | ||
var fd = isUserFd ? path : fs.openSync(path, options.flag || 'r', 0o666); | ||
|
||
tryStatSync(fd, isUserFd); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Now that TF+I are in, can we start inlining all of these There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. At least in a recently run benchmark (v8 5.8) it still seemed like it's a tiny bit better to keep them around. I suggest to wait until 6.0 has landed and if it's good to inline them, I'd make a single PR for all of them. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ack, since it's an patch level enhancement that should land in |
||
// Use stats array directly to avoid creating an fs.Stats instance just for | ||
// our internal use. | ||
var size; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. does a trinary with assign to const perform better? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There is not really a measurable difference. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🤷♂️ never mind then |
||
if (tryStatSync(fd, isUserFd) && (statValues[1/*mode*/] & S_IFMT) === S_IFREG) | ||
if ((statValues[1/*mode*/] & S_IFMT) === S_IFREG) | ||
size = statValues[8/*size*/]; | ||
else | ||
size = 0; | ||
|
@@ -1085,7 +1085,7 @@ if (constants.O_SYMLINK !== undefined) { | |
callback(err); | ||
return; | ||
} | ||
// prefer to return the chmod error, if one occurs, | ||
// Prefer to return the chmod error, if one occurs, | ||
// but still try to close, and report closing errors if they occur. | ||
fs.fchmod(fd, mode, function(err) { | ||
fs.close(fd, function(err2) { | ||
|
@@ -1098,20 +1098,18 @@ if (constants.O_SYMLINK !== undefined) { | |
fs.lchmodSync = function(path, mode) { | ||
var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK); | ||
|
||
// prefer to return the chmod error, if one occurs, | ||
// Prefer to return the chmod error, if one occurs, | ||
// but still try to close, and report closing errors if they occur. | ||
var err, err2, ret; | ||
var ret; | ||
try { | ||
ret = fs.fchmodSync(fd, mode); | ||
} catch (er) { | ||
err = er; | ||
} | ||
try { | ||
fs.closeSync(fd); | ||
} catch (er) { | ||
err2 = er; | ||
} catch (err) { | ||
try { | ||
fs.closeSync(fd); | ||
} catch (ignore) {} | ||
throw err; | ||
} | ||
if (err || err2) throw (err || err2); | ||
fs.closeSync(fd); | ||
return ret; | ||
}; | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess it was written like this for performance. If not, isn't cleaner to use
catch
and get rid of the threw variable?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am about to open a separate PR that deals with lots of those :D
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Get ready to run benchmarks then :) as I remember that some of these changes (
finally
->catch
) were rejected in the past. I think it was on timers.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Out of my perspective the main issue is that the error has to be thrown again.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hm, when running the benchmark it does not seem to be a significant change, so it would be more churn than anything else.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@BridgeAR please note that the performance profile of try/catch/finally changed quite a bit since the code was added most likely :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Of course but I ran the benchmarks with changing these to try catch and it did not show changed numbers. Therefore I think it's mainly churn to change it.