SlideShare a Scribd company logo
Node.js Community  Benchmarking WG update
Node.js Community
Benchmarking Efforts
Michael Dawson, IBM
About Michael Dawson
Loves the web and building software (with Node.js!)
Senior Software Developer @ IBM
IBM Runtime Technologies Node.js Technical Lead
Node.js collaborator and CTC member
Active in LTS, build, benchmarking , api
and post-mortem working groups
Contact me:
michael_dawson@ca.ibm.com
Twitter: @mhdawson1
https://www.linkedin.com/in/michael-dawson-6051282
4
About The Benchmarking Team
Love benchmarks and making things go faster.
5
Introduction to benchmarking
Node benchmarking workgroup
Real-life example
Agenda
Performance testing
Functional testing
6
Introduction
=
Fundamental run-to-run variance
– False positives
– Collecting enough samples to be sure of the result
– Documenting expected variance
Consistent environment
– Known starting machine state
– Machine isolation
– Interleave comparison runs
Jumping to conclusions
7
Introduction – Key Challenges
Change one thing and one thing only between runs
–Application code
–NPM module
–Runtime
–Machine
8
Introduction – Limit Entropy
9
Micro-Benchmarks
–Ex: Buffer.new()
Whole System
–Ex: AcmeAir - http://github.com/acmeair/acmeair-nodejs
Introduction – Approaches
I’ve found a regression in
…. now what ?
10
Introduction - Regressions
11
Introduction - Regressions
Are you sure ?
– Revalidate environment,
– Expected variance
If so, what changed ?
– Your application
– Node.js
– Your environment
Compare between good/bad cases
– Tools
– Binary search
12
Introduction – Sources of Regressions
Node.js
 lib/*.js – buffer, cluster, etc
V8
OpenSSL
libuv
NPM Module
13
Introduction – Tools
Javascript profiler
 V8 profiler
 Appmetrics - https://www.npmjs.com/package/appmetrics
 --trace-opt --trace-deopt
Native profiler (ex perf, tprof, oprofile)
14
Benchmark Workgroup
 Key goals
– Avoid Regressions
– Track and Evangelize gains between
releases
 How ?
 Define Use Cases
 Identify/Build Benchmarks
 Run/Capture results
https://github.com/nodejs/benchmarking
15
Benchmark Workgroup – Define Use Cases
https://github.com/nodejs/benchmarking/blob/master/docs/use_cases.md
16
Benchmark Workgroup – Runtime Attributes
https://github.com/nodejs/benchmarking/blob/master/docs/runtime_attributes.md
17
Benchmark Workgroup – Build/Identify Benchmarks
https://github.com/nodejs/benchmarking/blob/master/docs/case_coverage.md
18
Benchmark Workgroup – Build/Identify Benchmarks
https://github.com/nodejs/benchmarking/blob/master/docs/case_coverage.md
19
Benchmark Workgroup – Run/Capture Results
https://ci.nodejs.org/view/Node.js%20benchmark/
20
Benchmark Workgroup – Run/Capture Results
https://benchmarking.nodejs.org/
21
Benchmark Workgroup – Current Work
Expand benchmarks
Job -> run core benchmarks
 https://github.com/nodejs/benchmarking/pull/58
22
Example – The Code
var harness = require('../../common/harness.js');
var ARRAY = [1, 2, 23829, 4, 5, 7, 12312321, 2131, 434832, 43792, 23421, 65345, 132210,
77777, 322131, 1, 2, 23829, 4, 5, 7, 12312321, 2131, 434832, 43792, 23421, 65345, 132210,
77777, 322131, 1, 2, 23829, 4, 5, 7, 12312321, 2131, 434832, 43792, 23421, 65345, 132210,
77777, 322131, 1, 2, 23829, 4, 5, 7, 12312321, 2131, 434832, 43792, 23421, 65345, 132210,
77777, 322131];
var ITERATIONS = 300000;
var result;
function test() {
for(var i=0;i<ITERATIONS;i++) {
result = new Buffer(ARRAY);
}
}
harness.run_test(test);
23
Example – The Problem
Node 4.3.2:
./node benchmark.js
total time:5.079s / iterations:54 / ops/sec:10.63 / average time:0.09s /
variance:0.89%
total time:5.076s / iterations:54 / ops/sec:10.64 / average time:0.09s /
variance:0.75%
Node 4.4.0:
./node benchmark.js
total time:5.131s / iterations:31 / ops/sec:6.04 / average time:0.17s /
variance: 2.32%
total time:5.106s / iterations:31 / ops/sec:6.07 / average time:0.16s /
variance: 0.28%
= ~ 40% regression
24
Example – V8 Profiler
 Part of Node.js binary
 Turn on with
– --prof
 Test-tick-process to post-process
– ./node --prof-process isolate-0x2818130-v8.log
 Other helper modules like
– https://www.npmjs.com/package/v8-profiler
25
Example – V8 Profiler
< 5585 23.7% 23.9% LazyCompile: *fromObject buffer.js:121:20
< 1308 5.6% 5.6% LazyCompile: *subarray native typedarray.js:165:28
< 1263 5.4% 5.4% LazyCompile: *Uint8ArrayConstructByArrayBuffer native
typedarray.js:35:42
< 964 4.1% 4.1% Builtin: JSConstructStubGeneric
< 854 3.6% 3.7% Stub: InstanceofStub
< 677 2.9% 2.9% LazyCompile: *test benchmark.js:7:14
< 669 2.8% 2.9% LazyCompile: *Uint8Array native typedarray.js:122:31
---
> 15227 47.1% 47.3% LazyCompile: *fromObject buffer.js:121:20
> 1240 3.8% 3.9% LazyCompile: *subarray native typedarray.js:165:28
> 1166 3.6% 3.6% LazyCompile: *Uint8ArrayConstructByArrayBuffer native
typedarray.js:35:42
> 967 3.0% 3.0% Builtin: JSConstructStubGeneric
> 802 2.5% 2.5% Stub: InstanceofStub
> 780 2.4% 2.4% LazyCompile: *test benchmark.js:7:14
> 654 2.0% 2.0% LazyCompile: *Uint8Array native typedarray.js:122:31
26
Example – Perf
perf record -i -g -e cycles:u -- ./node --perf-basic-prof benchmark.js
perf report
diff perf_good.out perf_bad.out
327c302
< 91.52% 23.43% node perf-16993.map [.]
LazyCompile:*fromObject buffer.js:121
---
> 93.25% 46.56% node perf-16934.map [.]
LazyCompile:*fromObject buffer.js:121
331c306
--trace-opt --trace-deopt
[marking 0x39570dd44951 <JS Function fromObject (SharedFunctionInfo 0x39570dd12f91)> for
recompilation, reason: not much type info but very hot, ICs with typeinfo: 14/64 (21%), generic ICs: 0/64
(0%)]
[compiling method 0x39570dd44951 <JS Function fromObject (SharedFunctionInfo
0x39570dd12f91)> using Crankshaft]
[optimizing 0x39570dd44951 <JS Function fromObject (SharedFunctionInfo 0x39570dd12f91)> - took
0.315, 1.339, 0.511 ms]
[completed optimizing 0x39570dd44951 <JS Function fromObject (SharedFunctionInfo
0x39570dd12f91)>]
[deoptimizing (DEOPT eager): begin 0x39570dd44951 <JS Function fromObject (SharedFunctionInfo
0x39570dd12f91)>
[deoptimizing (eager): end 0x39570dd44951 <JS Function fromObject (SharedFunctionInfo
0x39570dd12f91)>
28
Example – The Narrowing
Binary Chop
– Compare changes between good & bad
– git rev-list ^good bad^
– Potentially time consuming
– git bisect is quite useful
29
Example – The Result
• Issue in v8 optimiser.
• Will be fixed there once TurboFan
becomes default
• Until then…
• github.com/nodejs/node/pull/5819
Get Involved !
 http://www.github.com/nodejs/benchmarking
We need to expand coverage
Need help in tracking perf and investigating issues
28
Copyrights and Trademarks
© IBM Corporation 2016. All Rights Reserved
IBM, the IBM logo, ibm.com are trademarks or registered
trademarks of International Business Machines Corp.,
registered in many jurisdictions worldwide. Other product and
service names might be trademarks of IBM or other companies.
A current list of IBM trademarks is available on the Web at
“Copyright and trademark information” at
www.ibm.com/legal/copytrade.shtml
Node.js is an official trademark of Joyent. IBM SDK for Node.js is not formally related to
or endorsed by the official Joyent Node.js open source or commercial project.
Java, JavaScript and all Java-based trademarks and logos are trademarks or registered
trademarks of Oracle and/or its affiliates.
Linux is a registered trademark of Linus Torvalds in the United States, other countries, or
both.
Microsoft, Windows, Windows NT, and the Windows logo are trademarks of Microsoft
Corporation in the United States, other countries, or both.
npm is a trademark of npm, Inc.

More Related Content

PPTX
Don't dump thread dumps
PDF
ioDrive de benchmarking 2011 1209_zem_distribution
PPTX
Code instrumentation
PPT
Find bottleneck and tuning in Java Application
PDF
Performance schema 설정
PDF
Thread dumps
PPTX
Thread dump troubleshooting
PPTX
Building frameworks over Selenium
Don't dump thread dumps
ioDrive de benchmarking 2011 1209_zem_distribution
Code instrumentation
Find bottleneck and tuning in Java Application
Performance schema 설정
Thread dumps
Thread dump troubleshooting
Building frameworks over Selenium

Viewers also liked (8)

PDF
Sap Teched 2015 Recap
PDF
Demystify big data data science
PPTX
Cloud foundry as driver of hana’s evolution
PPTX
Introduction to python for Beginners
ODP
Linux Introduction (Commands)
PDF
Node Foundation Membership Overview 20160907
PDF
The Enterprise Case for Node.js
PPT
Introduction to Python
Sap Teched 2015 Recap
Demystify big data data science
Cloud foundry as driver of hana’s evolution
Introduction to python for Beginners
Linux Introduction (Commands)
Node Foundation Membership Overview 20160907
The Enterprise Case for Node.js
Introduction to Python
Ad

Similar to Node.js Community Benchmarking WG update (20)

PPTX
Java Micro-Benchmarking
PDF
YOW2020 Linux Systems Performance
PDF
Рахманов Александр "Что полезного в разборе дампов для .NET-разработчиков?"
PDF
Effective Benchmarks
PDF
Machine learning key to your formulation challenges
PDF
Dr Elephant: LinkedIn's Self-Service System for Detecting and Treating Hadoop...
PDF
Comment j'ai mis ma suite de tests au régime en 5 minutes par jour
ODP
Performance Optimization of Rails Applications
PDF
Let's make this test suite run faster! SoftShake 2010
PDF
Performance Test Driven Development with Oracle Coherence
PDF
Applying profilers to my sql (fosdem 2017)
PDF
Finding Bugs, Fixing Bugs, Preventing Bugs - Exploiting Automated Tests to In...
PPTX
JavaMicroBenchmarkpptm
PDF
MongoDB World 2019: Becoming an Ops Manager Backup Superhero!
PPTX
GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...
PPTX
Test driven development in .Net - 2010 + Eclipse
PPTX
Testing ASP.NET - Progressive.NET
DOC
Web sphere application server performance tuning workshop
PDF
Performance_Programming
PPTX
Windows Azure Acid Test
Java Micro-Benchmarking
YOW2020 Linux Systems Performance
Рахманов Александр "Что полезного в разборе дампов для .NET-разработчиков?"
Effective Benchmarks
Machine learning key to your formulation challenges
Dr Elephant: LinkedIn's Self-Service System for Detecting and Treating Hadoop...
Comment j'ai mis ma suite de tests au régime en 5 minutes par jour
Performance Optimization of Rails Applications
Let's make this test suite run faster! SoftShake 2010
Performance Test Driven Development with Oracle Coherence
Applying profilers to my sql (fosdem 2017)
Finding Bugs, Fixing Bugs, Preventing Bugs - Exploiting Automated Tests to In...
JavaMicroBenchmarkpptm
MongoDB World 2019: Becoming an Ops Manager Backup Superhero!
GlobalLogic Test Automation Online TechTalk “Test Driven Development as a Per...
Test driven development in .Net - 2010 + Eclipse
Testing ASP.NET - Progressive.NET
Web sphere application server performance tuning workshop
Performance_Programming
Windows Azure Acid Test
Ad

More from Michael Dawson (18)

PDF
Index 2018 talk to your code
PDF
Index 2018 node.js what's next
PPTX
N api - node interactive 2017
PDF
N api-node summit-2017-final
PDF
Accelerate your digital transformation
PDF
Ask us anything v9
PDF
Cascon intro
PDF
A294 fips support in node
PDF
A295 nodejs-knowledge-accelerator
PDF
A301 ctu madrid2016-monitoring
PDF
Post mortem talk - Node Interactive EU
PDF
Update from-build-workgroup
PDF
Node fips
PDF
Micro app-framework - NodeLive Boston
PDF
Node liveboston welcome
PDF
Micro app-framework
PDF
Node home automation with Node.js and MQTT
PDF
Java one 2015 - v1
Index 2018 talk to your code
Index 2018 node.js what's next
N api - node interactive 2017
N api-node summit-2017-final
Accelerate your digital transformation
Ask us anything v9
Cascon intro
A294 fips support in node
A295 nodejs-knowledge-accelerator
A301 ctu madrid2016-monitoring
Post mortem talk - Node Interactive EU
Update from-build-workgroup
Node fips
Micro app-framework - NodeLive Boston
Node liveboston welcome
Micro app-framework
Node home automation with Node.js and MQTT
Java one 2015 - v1

Recently uploaded (20)

PDF
Electronic commerce courselecture one. Pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PPTX
Big Data Technologies - Introduction.pptx
PPTX
A Presentation on Artificial Intelligence
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Machine learning based COVID-19 study performance prediction
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
Electronic commerce courselecture one. Pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
Advanced methodologies resolving dimensionality complications for autism neur...
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
NewMind AI Weekly Chronicles - August'25-Week II
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Digital-Transformation-Roadmap-for-Companies.pptx
Unlocking AI with Model Context Protocol (MCP)
Agricultural_Statistics_at_a_Glance_2022_0.pdf
“AI and Expert System Decision Support & Business Intelligence Systems”
Big Data Technologies - Introduction.pptx
A Presentation on Artificial Intelligence
gpt5_lecture_notes_comprehensive_20250812015547.pdf
Spectral efficient network and resource selection model in 5G networks
Assigned Numbers - 2025 - Bluetooth® Document
Encapsulation_ Review paper, used for researhc scholars
Machine learning based COVID-19 study performance prediction
Group 1 Presentation -Planning and Decision Making .pptx

Node.js Community Benchmarking WG update

  • 3. About Michael Dawson Loves the web and building software (with Node.js!) Senior Software Developer @ IBM IBM Runtime Technologies Node.js Technical Lead Node.js collaborator and CTC member Active in LTS, build, benchmarking , api and post-mortem working groups Contact me: michael_dawson@ca.ibm.com Twitter: @mhdawson1 https://www.linkedin.com/in/michael-dawson-6051282
  • 4. 4 About The Benchmarking Team Love benchmarks and making things go faster.
  • 5. 5 Introduction to benchmarking Node benchmarking workgroup Real-life example Agenda
  • 7. Fundamental run-to-run variance – False positives – Collecting enough samples to be sure of the result – Documenting expected variance Consistent environment – Known starting machine state – Machine isolation – Interleave comparison runs Jumping to conclusions 7 Introduction – Key Challenges
  • 8. Change one thing and one thing only between runs –Application code –NPM module –Runtime –Machine 8 Introduction – Limit Entropy
  • 9. 9 Micro-Benchmarks –Ex: Buffer.new() Whole System –Ex: AcmeAir - http://github.com/acmeair/acmeair-nodejs Introduction – Approaches
  • 10. I’ve found a regression in …. now what ? 10 Introduction - Regressions
  • 11. 11 Introduction - Regressions Are you sure ? – Revalidate environment, – Expected variance If so, what changed ? – Your application – Node.js – Your environment Compare between good/bad cases – Tools – Binary search
  • 12. 12 Introduction – Sources of Regressions Node.js  lib/*.js – buffer, cluster, etc V8 OpenSSL libuv NPM Module
  • 13. 13 Introduction – Tools Javascript profiler  V8 profiler  Appmetrics - https://www.npmjs.com/package/appmetrics  --trace-opt --trace-deopt Native profiler (ex perf, tprof, oprofile)
  • 14. 14 Benchmark Workgroup  Key goals – Avoid Regressions – Track and Evangelize gains between releases  How ?  Define Use Cases  Identify/Build Benchmarks  Run/Capture results https://github.com/nodejs/benchmarking
  • 15. 15 Benchmark Workgroup – Define Use Cases https://github.com/nodejs/benchmarking/blob/master/docs/use_cases.md
  • 16. 16 Benchmark Workgroup – Runtime Attributes https://github.com/nodejs/benchmarking/blob/master/docs/runtime_attributes.md
  • 17. 17 Benchmark Workgroup – Build/Identify Benchmarks https://github.com/nodejs/benchmarking/blob/master/docs/case_coverage.md
  • 18. 18 Benchmark Workgroup – Build/Identify Benchmarks https://github.com/nodejs/benchmarking/blob/master/docs/case_coverage.md
  • 19. 19 Benchmark Workgroup – Run/Capture Results https://ci.nodejs.org/view/Node.js%20benchmark/
  • 20. 20 Benchmark Workgroup – Run/Capture Results https://benchmarking.nodejs.org/
  • 21. 21 Benchmark Workgroup – Current Work Expand benchmarks Job -> run core benchmarks  https://github.com/nodejs/benchmarking/pull/58
  • 22. 22 Example – The Code var harness = require('../../common/harness.js'); var ARRAY = [1, 2, 23829, 4, 5, 7, 12312321, 2131, 434832, 43792, 23421, 65345, 132210, 77777, 322131, 1, 2, 23829, 4, 5, 7, 12312321, 2131, 434832, 43792, 23421, 65345, 132210, 77777, 322131, 1, 2, 23829, 4, 5, 7, 12312321, 2131, 434832, 43792, 23421, 65345, 132210, 77777, 322131, 1, 2, 23829, 4, 5, 7, 12312321, 2131, 434832, 43792, 23421, 65345, 132210, 77777, 322131]; var ITERATIONS = 300000; var result; function test() { for(var i=0;i<ITERATIONS;i++) { result = new Buffer(ARRAY); } } harness.run_test(test);
  • 23. 23 Example – The Problem Node 4.3.2: ./node benchmark.js total time:5.079s / iterations:54 / ops/sec:10.63 / average time:0.09s / variance:0.89% total time:5.076s / iterations:54 / ops/sec:10.64 / average time:0.09s / variance:0.75% Node 4.4.0: ./node benchmark.js total time:5.131s / iterations:31 / ops/sec:6.04 / average time:0.17s / variance: 2.32% total time:5.106s / iterations:31 / ops/sec:6.07 / average time:0.16s / variance: 0.28% = ~ 40% regression
  • 24. 24 Example – V8 Profiler  Part of Node.js binary  Turn on with – --prof  Test-tick-process to post-process – ./node --prof-process isolate-0x2818130-v8.log  Other helper modules like – https://www.npmjs.com/package/v8-profiler
  • 25. 25 Example – V8 Profiler < 5585 23.7% 23.9% LazyCompile: *fromObject buffer.js:121:20 < 1308 5.6% 5.6% LazyCompile: *subarray native typedarray.js:165:28 < 1263 5.4% 5.4% LazyCompile: *Uint8ArrayConstructByArrayBuffer native typedarray.js:35:42 < 964 4.1% 4.1% Builtin: JSConstructStubGeneric < 854 3.6% 3.7% Stub: InstanceofStub < 677 2.9% 2.9% LazyCompile: *test benchmark.js:7:14 < 669 2.8% 2.9% LazyCompile: *Uint8Array native typedarray.js:122:31 --- > 15227 47.1% 47.3% LazyCompile: *fromObject buffer.js:121:20 > 1240 3.8% 3.9% LazyCompile: *subarray native typedarray.js:165:28 > 1166 3.6% 3.6% LazyCompile: *Uint8ArrayConstructByArrayBuffer native typedarray.js:35:42 > 967 3.0% 3.0% Builtin: JSConstructStubGeneric > 802 2.5% 2.5% Stub: InstanceofStub > 780 2.4% 2.4% LazyCompile: *test benchmark.js:7:14 > 654 2.0% 2.0% LazyCompile: *Uint8Array native typedarray.js:122:31
  • 26. 26 Example – Perf perf record -i -g -e cycles:u -- ./node --perf-basic-prof benchmark.js perf report diff perf_good.out perf_bad.out 327c302 < 91.52% 23.43% node perf-16993.map [.] LazyCompile:*fromObject buffer.js:121 --- > 93.25% 46.56% node perf-16934.map [.] LazyCompile:*fromObject buffer.js:121 331c306
  • 27. --trace-opt --trace-deopt [marking 0x39570dd44951 <JS Function fromObject (SharedFunctionInfo 0x39570dd12f91)> for recompilation, reason: not much type info but very hot, ICs with typeinfo: 14/64 (21%), generic ICs: 0/64 (0%)] [compiling method 0x39570dd44951 <JS Function fromObject (SharedFunctionInfo 0x39570dd12f91)> using Crankshaft] [optimizing 0x39570dd44951 <JS Function fromObject (SharedFunctionInfo 0x39570dd12f91)> - took 0.315, 1.339, 0.511 ms] [completed optimizing 0x39570dd44951 <JS Function fromObject (SharedFunctionInfo 0x39570dd12f91)>] [deoptimizing (DEOPT eager): begin 0x39570dd44951 <JS Function fromObject (SharedFunctionInfo 0x39570dd12f91)> [deoptimizing (eager): end 0x39570dd44951 <JS Function fromObject (SharedFunctionInfo 0x39570dd12f91)>
  • 28. 28 Example – The Narrowing Binary Chop – Compare changes between good & bad – git rev-list ^good bad^ – Potentially time consuming – git bisect is quite useful
  • 29. 29 Example – The Result • Issue in v8 optimiser. • Will be fixed there once TurboFan becomes default • Until then… • github.com/nodejs/node/pull/5819
  • 30. Get Involved !  http://www.github.com/nodejs/benchmarking We need to expand coverage Need help in tracking perf and investigating issues 28
  • 31. Copyrights and Trademarks © IBM Corporation 2016. All Rights Reserved IBM, the IBM logo, ibm.com are trademarks or registered trademarks of International Business Machines Corp., registered in many jurisdictions worldwide. Other product and service names might be trademarks of IBM or other companies. A current list of IBM trademarks is available on the Web at “Copyright and trademark information” at www.ibm.com/legal/copytrade.shtml Node.js is an official trademark of Joyent. IBM SDK for Node.js is not formally related to or endorsed by the official Joyent Node.js open source or commercial project. Java, JavaScript and all Java-based trademarks and logos are trademarks or registered trademarks of Oracle and/or its affiliates. Linux is a registered trademark of Linus Torvalds in the United States, other countries, or both. Microsoft, Windows, Windows NT, and the Windows logo are trademarks of Microsoft Corporation in the United States, other countries, or both. npm is a trademark of npm, Inc.