FazBrowse GitHub Viewer | Trending |
URL:
| Home
Tools: [Download Repo ZIP]   [Original HTTPS Page]

node: improve GetActiveRequests performance by trevnorris · Pull Request #3375 · nodejs/node · GitHub

/ node Public

node: improve GetActiveRequests performance - #3375

Closed
trevnorris wants to merge 1 commit into
nodejs:masterfrom
trevnorris:make-get-faster
Closed

node: improve GetActiveRequests performance#3375
trevnorris wants to merge 1 commit into
nodejs:masterfrom
trevnorris:make-get-faster

Conversation

Copy link
Copy Markdown
Contributor

v8 is faster at setting object properties in JS than C++. Even when it
requires calling into JS from native code. Make
process._getActiveRequests() faster by doing this when populating the
array containing request objects.

Simple benchmark:

for (let i = 0; i < 22; i++)
  fs.open(__filename, 'r', function() { });
let t = process.hrtime();
for (let i = 0; i < 1e6; i++)
  process._getActiveRequests();
t = process.hrtime(t);
console.log((t[0] * 1e9 + t[1]) / 1e6);

Results between the two:

Previous:  4406 ns/op
Patched:    829 ns/op     4.3x faster

R=@bnoordhuis

Have another addition of improving the same for active handles, but wanted to solicit feedback on the approach early.

trevnorris added the c++ Issues and PRs that require attention from people who are familiar with C++. label Oct 14, 2015

rvagg commented Oct 15, 2015

Copy link
Copy Markdown
Member

Is "index" the right word to use here? you're just appending and not actually using an index

Copy link
Copy Markdown
Contributor

While performance improvements are nice, this definitely adds more code than it removes. Is the use case here continuous monitoring? This is still an undocumented API... for what reason I don't know though, seems it would help to make it public (I've used it too, and find it very useful, but that's usually been limited to shutdown-time).

Copy link
Copy Markdown
Contributor Author

@rvagg That's an artifact of an early implementation. I'll find a better name.

@ronkorving The use case is to not have a crappy implementation. This is a technique that I plan to expand through core. Search for Object::Set() and you'll see how heavily we rely on this slow operation. Here was simply the easiest location to kick off.

LOC should have little to no affect on a PR. Added complexity I can understand, and can agree with based on circumstance. This though is fairly straightforward.

Copy link
Copy Markdown
Contributor

Is there any way we could help the V8 team (I say we.. as if I really could) to make Object::Set as fast as JIT compiled JavaScript?

Comment thread src/node.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Can you use ARRAY_SIZE(argv) instead of hard-coding it in several places? If it gets unwieldy, I suggest writing it as:

static const size_t argc = 5;
Local<Value> argv[argc];
// ...
argv[i++ % argc] = ...;

Copy link
Copy Markdown
Member

This could be extended to numerous other places but I assume that's your plan anyway. :-)

Copy link
Copy Markdown
Contributor Author

@bnoordhuis Comments addressed (I think). Yes, I am planning on extending this across core but figured this would be a good low impact place to start off. :)

Comment thread src/node.cc

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

Shouldn't this check that i > 0? It's going to make a superfluous JS call now if I read it right.

EDIT: Never mind, didn't read it right. It's never zero.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

this is the most succinct way I found, but even looking back at this over the weekend I needed to remember what the logic was doing. if you have something more readable in mind I'm open to suggestions. :)

Copy link
Copy Markdown
Contributor Author

@bnoordhuis made most suggested changes and added a simple test.

CI: https://ci.nodejs.org/job/node-test-pull-request/536/

Comment thread src/node.cc Outdated

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

This is the repetition I mean. I'd do the i % argc only once and cache the result in a const size_t remainder.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality

ah, got it. was trying to make it work w/ the for loop above.

Copy link
Copy Markdown
Contributor Author

@bnoordhuis comment addressed.

jasnell commented Oct 21, 2015

Copy link
Copy Markdown
Member

Nice change, although it makes me sad that Object::Set is so slow. LGTM so long as CI is green and setPropByIndex is refactored to get away from the val0, ... val7 pattern.

v8 is faster at setting object properties in JS than C++. Even when it
requires calling into JS from native code. Make
process._getActiveRequests() faster by doing this when populating the
array containing request objects.

Simple benchmark:

    for (let i = 0; i < 22; i++)
      fs.open(__filename, 'r', function() { });
    let t = process.hrtime();
    for (let i = 0; i < 1e6; i++)
      process._getActiveRequests();
    t = process.hrtime(t);
    console.log((t[0] * 1e9 + t[1]) / 1e6);

Results between the two:

    Previous:  4406 ns/op
    Patched:    690 ns/op     5.4x faster

Copy link
Copy Markdown
Contributor Author

jasnell commented Oct 21, 2015

Copy link
Copy Markdown
Member

LGTM if CI is green

Copy link
Copy Markdown
Member

LGTM

trevnorris added a commit that referenced this pull request Oct 21, 2015
v8 is faster at setting object properties in JS than C++. Even when it
requires calling into JS from native code. Make
process._getActiveRequests() faster by doing this when populating the
array containing request objects.

Simple benchmark:

    for (let i = 0; i < 22; i++)
      fs.open(__filename, 'r', function() { });
    let t = process.hrtime();
    for (let i = 0; i < 1e6; i++)
      process._getActiveRequests();
    t = process.hrtime(t);
    console.log((t[0] * 1e9 + t[1]) / 1e6);

Results between the two:

    Previous:  4406 ns/op
    Patched:    690 ns/op     5.4x faster

PR-URL: #3375
Reviewed-By: James Snell <jasnell@gmail.com>
Reviewed-By: Ben Noordhuis <ben@strongloop.com>

Copy link
Copy Markdown
Contributor Author

None of the failures are related to the PR. Landed on 494227b. Thanks much!

trevnorris closed this Oct 21, 2015
trevnorris added a commit that referenced this pull request Oct 22, 2015
v8 is faster at setting object properties in JS than C++. Even when it
requires calling into JS from native code. Make
process._getActiveRequests() faster by doing this when populating the
array containing request objects.

Simple benchmark:

    for (let i = 0; i < 22; i++)
      fs.open(__filename, 'r', function() { });
    let t = process.hrtime();
    for (let i = 0; i < 1e6; i++)
      process._getActiveRequests();
    t = process.hrtime(t);
    console.log((t[0] * 1e9 + t[1]) / 1e6);

Results between the two:

    Previous:  4406 ns/op
    Patched:    690 ns/op     5.4x faster

PR-URL: #3375
Reviewed-By: James Snell <jasnell@gmail.com>
Reviewed-By: Ben Noordhuis <ben@strongloop.com>

Copy link
Copy Markdown
Contributor

@trevnorris what are your thought regarding adding this commit to LTS?

Copy link
Copy Markdown
Contributor

@trevnorris ping

Copy link
Copy Markdown
Contributor Author

@thealphanerd oop. sorry. It's a micro-performance optimization. Merging will doubtfully prevent future conflicts. So, can land but don't think it's necessary.

This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

c++ Issues and PRs that require attention from people who are familiar with C++.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants


Back | FazBrowse Home | New Git URL