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

Faster than C?

Faster than C?

Presentation given at the Prague JS Usergroup.

Felix Geisendörfer

November 29, 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 at telling you which functions

    are slow • Bad at telling you how to fix it
  6. @felixge felixge Taking performance advice from strangers • Good for

    ideas & inspiration • But useless when applied cargo-cult style
  7. @felixge felixge for (var i = 0; i < array.length;

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

    i < length; i++) { // do some work with array[i] }
  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 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. @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);
  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