Faster than C?

Faster than C?

Presentation given at nodedublin.

23968f0ca75b13463d2db5343e5c2096?s=128

Felix Geisendörfer

October 18, 2012
Tweet

Transcript

  1. 11.
  2. 15.
  3. 24.
  4. 26.
  5. 30.

    “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.”
  6. 32.

    “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.”
  7. 34.
  8. 35.

    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
  9. 41.
  10. 45.
  11. 51.
  12. 52.

    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
  13. 54.
  14. 58.
  15. 61.
  16. 64.

    Profiling • Good for spotting small functions with stupid algorithms

    performing many iterations • Bad for complex functions with many primitive operations
  17. 65.

    Taking performance advice from strangers • Good for ideas &

    inspiration • But useless when applied cargo-cult style
  18. 66.
  19. 68.

    Benchmark Driven Development • Similar to test driven development •

    Use it when performance is an explicit design goal • Benchmark first > benchmark after !
  20. 70.

    1 while (true) { 2 var start = Date.now(); 3

    benchmark(); 4 var duration = Date.now() - start; 5 console.log(duration); 6 }
  21. 71.

    Benchmark Driven Development • Next step: Implement a tiny part

    of your function • Example: Parse headers of MySQL packets • Look at impact, tweak code, repeat
  22. 72.

    Example Results • try...catch is ok • big switch statement

    = bad • function calls = very cheap • buffering is ok
  23. 73.
  24. 74.

    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 }
  25. 76.

    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);
  26. 77.

    ->

  27. 78.

    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 }
  28. 83.

    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 !!
  29. 84.

    Recommended Tools • node benchmark.js | tee results.tsv • R

    Programming language (with ggplot2) ! • Makefiles, Image Magick, Skitch
  30. 85.
  31. 87.

    • • • • • • • • • •

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

    • • • • • • • • • •

    • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • •• • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • 3,000 4,000 5,000 6,000 mysql2 new−parser benchmark mbit benchmark • • mysql2 new−parser Dafuq? Dafuq?
  33. 89.
  34. 90.

    10 20 30 0 100 200 300 number Heap Total

    (MB) benchmark mysql2 new−parser
  35. 91.

    5 10 15 0 100 200 300 number Heap Used

    (MB) benchmark mysql2 new−parser
  36. 92.
  37. 93.

    1. Write a benchmark 2. Write/change a little code 3.

    Collect data 4. Find problems 5. Goto 2
  38. 94.
  39. 96.
  40. 97.