Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Faster than C?

Faster than C?

Presentation given at JSConf.eu

Felix Geisendörfer

October 07, 2012
Tweet

More Decks by Felix Geisendörfer

Other Decks in Programming

Transcript

  1. “When a first body exerts a force F1 on a

    second body, the second body simultaneously exerts a force F2 = −F1 on the first body. This means that F1 and F2 are equal in magnitude and opposite in direction.”
  2. “When a first person pushes a library L1 into a

    remote repository, a second person simultaneously starts working on a second library L2 which will be equally awesome, but in a different way.”
  3. 0 1,000 2,000 3,000 4,000 mysql−0.9.6 mysql−libmysqlclient−1.5.1 mysql−2.0.0−alpha3 mariadb−0.1.7 benchmark

    mbit benchmark mysql−0.9.6 mysql−libmysqlclient−1.5.1 mysql−2.0.0−alpha3 mariadb−0.1.7
  4. Profiling • Good for spotting small functions with stupid algorithms

    performing many iterations • Bad for complex functions with many primitive operations
  5. Taking performance advice from strangers • Good for ideas &

    inspiration • But useless when applied cargo-cult style
  6. BDD

  7. Benchmark Driven Development • Similar to test driven development •

    Use it when performance is an explicit design goal • Benchmark first > benchmark after !
  8. 1 while (true) { 2 var start = Date.now(); 3

    benchmark(); 4 var duration = Date.now() - start; 5 console.log(duration); 6 }
  9. Benchmark Driven Development • Next step: Implement a tiny part

    of your function • Example: Parse headers of MySQL packets • Look at impact, tweak code, repeat
  10. Example Results • try...catch is ok • big switch statement

    = bad • function calls = very cheap • buffering is ok
  11. 1 function parseRow(columns, parser) { 2 var row = {};

    3 for (var i = 0; i < columns.length; i++) { 4 row[columns[i].name] = parser.readColumnValue(); 5 } 6 return row; 7 }
  12. 1 var code = 'return {\n'; 2 3 columns.forEach(function(column) {

    4 code += '"' + column.name + '":' + 'parser.readColumnValue(),\n'; 5 }); 6 7 code += '};\n'; 8 9 var parseRow = new Function('columns', 'parser', code);
  13. ->

  14. 1 function parseRow(columns, parser) { 2 return { 3 id

    : parser.readColumnValue(), 4 title : parser.readColumnValue(), 5 body : parser.readColumnValue(), 6 created : parser.readColumnValue(), 7 updated : parser.readColumnValue(), 8 }; 9 }
  15. Data analysis • Produce data points as tab separated values

    • Add as many VM/OS metrics as you can get to every line • Do not mix data and analysis !!
  16. Recommended Tools • node benchmark.js | tee results.tsv • R

    Programming language (with ggplot2) ! • Makefiles, Image Magick, Skitch
  17. • • • • • • • • • •

    • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • •• • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 3,000 4,000 5,000 6,000 mysql2 new−parser benchmark mbit benchmark • • mysql2 new−parser
  18. • • • • • • • • • •

    • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • •• • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 3,000 4,000 5,000 6,000 mysql2 new−parser benchmark mbit benchmark • • mysql2 new−parser Dafuq? Dafuq?
  19. 10 20 30 0 100 200 300 number Heap Total

    (MB) benchmark mysql2 new−parser
  20. 5 10 15 0 100 200 300 number Heap Used

    (MB) benchmark mysql2 new−parser
  21. 1. Write a benchmark 2. Write/change a little code 3.

    Collect data 4. Find problems 5. Goto 2