Podstawy profilowania
i analiza wydajności aplikacji webowych

Licencja: CC BY-ND 3.0 PL

Oznaczenia

Dobre praktyki

Ostrzeżenie!

Złe przykłady

Wprowadzenie

Co to znaczy szybko ?

OpóźnienieReakcja użytkownika
0 - 100 msBłyskawicznie
100 - 300 msMinimalne opóźnienie
300 - 1000 msWyczuwalne opóźnienie
> 1 sZmiana kontekstu
> 10 s"Wrócę później..."

Co to znaczy płynnie ?

===

Jak to osiągnąć?

Musimy wiedzieć jak najwięcej o środowisku

Budowa przeglądarki

Złożoność

10 mln < 15 mln

Firefox 26 Linux 3.3 1.5x

Architektura

Context Switching

Browser flow

Sieć

Bandwidth vs. Latency

Visualization of latency costs
Zmniejszenie opóźnienia o 1 ms kosztuje 80 mln $

A co z mobile?

Jest jeszcze gorzej!

4G - średnie opóźnienie: 150 ms
3G - średnie opóźnienie: 400 ms

Tryby pracy modemu

Ilość żądań

Too many requests

Ilość żądań

Optymalizacja

  • Dla dużej ilości obrazków używaj techniki sprites
  • Unikaj przekierowań i powolnych serwerów DNS
  • Korzystaj z serwerów CDN
  • Rozprosz zasoby i zastosuj sharding
  • Hostuj statyczne zasoby na osobnym serwerze
  • Hostuj statyczne zasoby bez SSL
  • Usuwanie ciasteczek i zbędnych nagłówków
  • HTTP Cache - ETags oraz If-Modified-Since
  • Zmniejsz liczbę osobnych plików *.js oraz *.css
  • Kompresuj dane tekstowe
  • Stosuj DNS prefetching

Ścieżka krytyczna

Visualization of critical path

Parsowanie

Parser workflow

Skrypty

Difference between async, defer and regular

Reflow / Layout

... czyli las w przeglądarce ;)

Visualization of layout in the browser

Rysowanie

Repaint

... czyli przenosimy las na ekran ;)

Visualization of forest in the browser
requestAnimationFrame()
requestAnimationFrame importance visualization

A co z GPU?

Composition sample
Możemy wymuszać akcelerację sprzętową dla poszczególnych elementów

Wszystko na GPU !

Composite all the things meme ;)

Na pewno nie wszystko

  • Pamięć na GPU jest skończona
  • Koszt przesyłu danych pomiędzy RAM a VRAM
  • Kluczem jest tutaj znajomość aplikacji

Ale to jeszcze nie koniec...

Bateria

Battery exhausted image
  • Nadmierne wykorzystanie WiFi / 3G / 4G
  • Nadmierne wykorzystanie CPU i GPU

Garbage Collector

  • Scavenge
  • Mark-Sweep

Narzędzia

Google Chrome

Zdarzenia

Google Chrome timeline presentation

Google Chrome

Profilowanie

Google Chrome profiling presentation

Google Chrome

Pamięć

Google Chrome memory presentation

Google Chrome

Sieć

Google Chrome network tab presentation

Google Chrome

Konsola

Google Chrome console presentation

Google Chrome

Renderowanie

Google Chrome rendering tools

Firefox

Firefox Nightly presentation

IE 9 / 10

IE 10 presentation

IE 11

IE 11 presentation

Inne

Najważniejsze to dobrze poznać narzędzia deweloperskie z ulubionej przeglądarki

Navigation Timing API

Navigation Timing API

Navigation Timing API

Navigation Timing API usage

ySlow

ySlow presentation

PageSpeed

Audit made from PageSpeed online

Google Speed Tracer

Google Chrome Web Performance Toolkit

Google Speed Tracer presentation

Chrome Hidden Pages

Windows Performance Toolkit

Windows Performance Toolkit presentation

V8 profiler - D8

d8 presentation

Benchmarki

Tryb prywatny

Narzędzia

Microbenchmarks

Microbenchmark sample

You do it wrong!

Microbenchmark sample

Dlaczego?


function benchmark() {
  function fn(a, b, c, d) {
    return a + b + c + d;
  }

  var start = new Date;
  for (var n = 0; n < 1e6; n++) {
    fn('a', 'b', 'c', 'd');
  }
  return (new Date - start);
}
            

Dlaczego?


function benchmark() {
  var start = new Date;
  for (var n = 0; n < 1e6; n++) {
    // Ponieważ znamy fn, rozwijamy ją w miejscu wywołania:
    a + b + c + d;
  }
  return (new Date - start);
}
            

Dlaczego?


function benchmark() {
  var start = new Date;
  for (var n = 0; n < 1e6; n++) {
    // Wynik nie jest nigdzie używany więc kompilator go usunie...
  }
  return (new Date - start);
}
            

Dlaczego?


function benchmark() {
  var start = new Date;

  // ... razem z pętlą for, która była teraz pusta ;).

  return (new Date - start);
}
            

Don't take performance advices from strangers!

Felix Geisendörfer

Don't guess it, test it!

Paul Lewis

Case Studies

JavaScript

Pamięć

DOM

Sieć

Pytania?

Dziękuję za uwagę!

Odniesienia i bibliografia: