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

Faster than C?

Faster than C?

Presentation given at nodeconf.it.

Felix Geisendörfer

November 10, 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. @felixge felixge Benchmark • Parse ~180 MB / 100.000 rows

    of MySQL result data • 5 Columns: id, title, text, created, updated • -> create 100k objects with 500k keys + 500k values
  4. felixge 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
  5. @felixge felixge Profiling • Good for spotting small functions with

    stupid algorithms performing many iterations • Bad for complex functions with many primitive operations
  6. @felixge felixge for (var i = 0; i < array.length;

    i++) { // do some work with array[i] }
  7. @felixge felixge for (var i = 0, length = array.length;

    i < length; i++) { // do some work with array[i] }
  8. @felixge felixge Taking performance advice from strangers • Good for

    ideas & inspiration • But useless when applied cargo-cult style
  9. @felixge felixge Benchmark Driven Development • Similar to test driven

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

    3 benchmark(); 4 var duration = Date.now() - start; 5 console.log(duration); 6 }
  11. @felixge felixge Benchmark Driven Development • Next step: Implement a

    tiny part of your function • Example: Parse headers of MySQL packets • Look at impact, tweak code, repeat
  12. @felixge felixge Example Results • try...catch is ok • big

    switch statement = bad • function calls = very cheap • buffering is ok
  13. @felixge felixge 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 }
  14. @felixge felixge 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);
  15. @felixge felixge 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 }
  16. @felixge felixge 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 !!
  17. @felixge felixge Recommended Tools • node benchmark.js | tee results.tsv

    • R Programming language (with ggplot2) ! • Makefiles, Image Magick, Skitch
  18. @felixge felixge • • • • • • • •

    • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • •• • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 3,000 4,000 5,000 6,000 mysql2 new−parser benchmark mbit benchmark • • mysql2 new−parser
  19. @felixge felixge • • • • • • • •

    • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • •• • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 3,000 4,000 5,000 6,000 mysql2 new−parser benchmark mbit benchmark • • mysql2 new−parser Dafuq? Dafuq?
  20. @felixge felixge 3,000 4,000 5,000 6,000 0 100 200 300

    number mbit benchmark mysql2 new−parser
  21. @felixge felixge 10 20 30 0 100 200 300 number

    Heap Total (MB) benchmark mysql2 new−parser
  22. @felixge felixge 5 10 15 0 100 200 300 number

    Heap Used (MB) benchmark mysql2 new−parser
  23. @felixge felixge 1. Write a benchmark 2. Write/change a little

    code 3. Collect data 4. Find problems 5. Goto 2