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

And Benchmarks For All

And Benchmarks For All

A talk about browsers, JavaScript, V8 and compilers.

Avatar for Alex Navasardyan

Alex Navasardyan

August 26, 2014
Tweet

More Decks by Alex Navasardyan

Other Decks in Programming

Transcript

  1. the act of running a computer program, in order to

    assess the relative performance of an object.
  2. V8

  3. function Person(first, last) { this.firstName = first; this.lastName = last;

    } ! var ironMan = new Person(‘Tony’, ‘Stark’); var captainAmerica = new Person(‘Steve’, ‘Rogers’); captainAmerica.age = 83;
  4. function Person(first, last) { this.firstName = first; this.lastName = last;

    } ! var ironMan = new Person(‘Tony’, ‘Stark’); var captainAmerica = new Person(‘Steve’, ‘Rogers’); captainAmerica.age = 83;
  5. function Person(first, last) { this.firstName = first; this.lastName = last;

    } ! var ironMan = new Person(‘Tony’, ‘Stark’); var captainAmerica = new Person(‘Steve’, ‘Rogers’); captainAmerica.age = 83; Class C0
  6. function Person(first, last) { this.firstName = first; this.lastName = last;

    } ! var ironMan = new Person(‘Tony’, ‘Stark’); var captainAmerica = new Person(‘Steve’, ‘Rogers’); captainAmerica.age = 83; Class C1:C0
  7. function Person(first, last) { this.firstName = first; this.lastName = last;

    } ! var ironMan = new Person(‘Tony’, ‘Stark’); var captainAmerica = new Person(‘Steve’, ‘Rogers’); captainAmerica.age = 83; Class C2:C1
  8. function Person(first, last) { this.firstName = first; this.lastName = last;

    } ! var ironMan = new Person(‘Tony’, ‘Stark’); var captainAmerica = new Person(‘Steve’, ‘Rogers’); captainAmerica.age = 83; Class C2:C1
  9. function Person(first, last) { this.firstName = first; this.lastName = last;

    } ! var ironMan = new Person(‘Tony’, ‘Stark’); var captainAmerica = new Person(‘Steve’, ‘Rogers’); captainAmerica.age = 83; Class C3:C2
  10. • initialize object members in constructor functions. • always initialize

    object members in the same order (different hidden class trees).
  11. • 32 bit are used to represent both a number

    and an object (to use the same code path). • last bit is 0 (number), 31 bit signed integer. • last bit is 1 (object). • if bigger than 31 bit, it creates a pointer to a new object.
  12. • use contiguous index starting at 0. • don’t preallocate

    large arrays. • don’t delete elements in arrays. • use array literals.
  13. push [ebp+0x8] mov eax,[ebp+0xc] mov edx, eax mov ecx, 0x60b55dd1

    call LoadIC_Initialize ;; ironMan.firstName
  14. var a = “12342234”, b, start = Date.now(); ! for

    (var i = 0; i < 1000; i++) { b = ~~a; } ! console.log(Date.now() - start); Convert string to a number
  15. var a, b, start = Date.now(); ! for (var i

    = 0; i < 1000; i++) { b = ~~“12342234”; } ! console.log(Date.now() - start); Inlines the string
  16. var a, b, start = Date.now(); ! for (var i

    = 0; i < 1000; i++) { b = 12342234; } ! console.log(Date.now() - start); Inlines the converted value
  17. var a, b, start = Date.now(); ! for (var i

    = 0; i < 1000; i++) { // benchmarking the assignment b = 12342234; } ! console.log(Date.now() - start); Constant Propagation
  18. var a = Date.now().toString(); var b, start = Date.now(); !

    for (var i = 0; i < 1000; i++) { b = ~~a; } ! console.log(Date.now() - start); Convert string to a number
  19. var a = Date.now().toString(); var b, start = Date.now(); !

    var c = ~~a; for (var i = 0; i < 1000; i++) { b = c; } ! console.log(Date.now() - start); Hoists the conversion
  20. var a = Date.now().toString(); var b, start = Date.now(); !

    var c = ~~a; for (var i = 0; i < 1000; i++) { // benchmarking the assignment b = c; } ! console.log(Date.now() - start); Loop Invariant Motion
  21. var start = Date.now(); ! for (var i = 0;

    i < 1000; i++) { // happy benchmarking } ! console.log(Date.now() - start); Dead Code Elimination
  22. var add = function(a, b, c, d) { return a

    + b + c + d; }; ! for (var i = 0; i < 1000; i++) { add(“a”, “b”, “c”, “d"); } Function inlining
  23. for (var i = 0; i < 1000; i++) {

    “a” + “b” + “c” + “d” } Function inlining
  24. for (var i = 0; i < 1000; i++) {

    “a” + “b” + “c” + “d” } ! for (var i = 0; i < 1000; i++) { // happy benchmarking } Benchmarking inlining
  25. • leave your laptop plugged in. • close all running

    applications. • be prepared for the results to be inconsistent.