Превышаем скоростные лимиты с angular 2 / Алексей...

119
Превышаем скоростные лимиты с Angular 2 Алексей Охрименко - IPONWEB

Upload: ontico

Post on 16-Apr-2017

715 views

Category:

Engineering


6 download

TRANSCRIPT

Page 1: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Превышаем скоростные лимиты с Angular 2Алексей Охрименко - IPONWEB

Page 2: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Алексей Охрименко

Twitter: @Ai_boy

IPONWEB

Page 3: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 4: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 5: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 6: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 7: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

IPONWEB

RTB

DSP

SSP

Page 8: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

8

Page 9: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

последствия превышения скорости (в реальной жизни)

Page 10: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

последствия превышения скорости*

* - поищите в Google Image - 4-ый результат

Page 11: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Всегда успеете…

Page 12: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

А где тогда скорость превышать?

Page 13: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 14: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 15: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Angular 2, Angular 2… нас и [НАШ_FRAMEWORK]

неплохо кормит

Page 16: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 17: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

А что значит «скорость»?

Page 18: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Скорость загрузки

Page 19: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Скорость загрузки

Размер

Page 20: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Скорость загрузки

Размер

LazyLoading

Page 21: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Скорость загрузки

Скорость работы

Размер

LazyLoading

Page 22: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Скорость загрузки

Скорость работы

Размер

LazyLoading

Обьем работы

Page 23: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Скорость загрузки

Скорость работы

Размер

LazyLoading

Обьем работы Производительность

Page 24: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Скорость загрузки

Скорость работы

Размер

LazyLoading

Обьем работы Производительность

Память

Page 25: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Скорость загрузки

Скорость работы

Размер

LazyLoading

Обьем работы

Многопоточность

Производительность

Память

Page 26: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Скорость работы

Обьем работы

Многопоточность

Производительность

Память

Скорость загрузки

Размер

LazyLoading

Page 27: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Скорость работы

Page 28: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

https://github.com/krausest/js-framework-benchmark

https://github.com/mathieuancelin/js-repaint-perfs

Page 29: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 30: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Кол-во перерисовок в секунду (больше лучше)

Angular 1

Angular 2

React

Elm

0 9 18 27 36

Page 31: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Наша цель … 90 RR

Page 32: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Кол-во перерисовок в секунду (больше лучше)

Angular 2

Target

0 10 20 30 40 50 60 70 80 90

Page 33: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Старая версия Angular 2

Page 34: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Alpha 44

Page 35: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Alpha 44 —> v2.1.2

Page 36: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Alpha 44

Angular 2

Target

0 10 20 30 40 50 60 70 80 90

Page 37: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

v2.1.2

Angular 2

Target

0 10 20 30 40 50 60 70 80 90

Page 38: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

v2.1.2

Angular 2

Target

0 10 20 30 40 50 60 70 80 90

Page 39: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

На самом деле все просто…

Page 40: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Angular 2 Performance Checklist

Page 41: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

import {enableProdMode} from '@angular/core';

enableProdMode();

Page 42: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

300% в EdgeenableProdMode()

Page 43: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Alpha 44

Angular 2

Target

0 10 20 30 40 50 60 70 80 90

Page 44: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

v2.1.2 + enableProdMod()

Angular 2

Target

0 10 20 30 40 50 60 70 80 90

Page 45: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

function getData(keepIdentity) { var oldData = data; if (!keepIdentity) { // reset for each tick data = []; for (var i = 1; i <= ENV.rows; i++) { data.push({ … }); data.push({ … }); } } }

Page 46: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

@Page({ template: ` <div *ngFor="let post of posts;trackBy:identify"> {{post.data}} </div> ` }) export class SomeConponent { identify(index,item){ return post.id } }

Page 47: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

@Page({ template: ` <div *ngFor="let post of posts;trackBy:identify"> {{post.data}} </div> ` }) export class SomeConponent { identify(index,item){ return post.id } }

Page 48: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

v2.1.2 + enableProdMod()

Angular 2

Target

0 10 20 30 40 50 60 70 80 90

Page 49: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

trackBy

Angular 2

Target

0 10 20 30 40 50 60 70 80 90

Page 50: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

AOTAhead Of Time template compilation

Page 51: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 52: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 53: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Angular CLI

ng serve ——aot

ng build ——aot

Page 54: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

trackBy

Angular 2

Target

0 10 20 30 40 50 60 70 80 90

Page 55: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

AOT

Angular 2

Target

0 10 20 30 40 50 60 70 80 90

Page 56: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

WebWorkers

Page 57: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

import {bootstrapWorkerUi} from '@angular/platform-webworker'; import {enableProdMode} from '@angular/core';

export function main() { enableProdMode(); bootstrapWorkerUi('loader.js'); }

Page 58: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

import {bootstrapWorkerUi} from '@angular/platform-webworker'; import {enableProdMode} from '@angular/core';

export function main() { enableProdMode(); bootstrapWorkerUi('loader.js'); }

Page 59: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

@NgModule({ imports: [WorkerAppModule], bootstrap: [AppComponent], declarations: [AppComponent] }) class WebWorkerModule {}

export function main() { enableProdMode(); platformWorkerAppDynamic().bootstrapModule(WebWorkerModule); }

Page 60: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

@NgModule({ imports: [WorkerAppModule], bootstrap: [AppComponent], declarations: [AppComponent] }) class WebWorkerModule {}

export function main() { enableProdMode(); platformWorkerAppDynamic().bootstrapModule(WebWorkerModule); }

Page 61: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

AOT

Angular 2

Target

0 10 20 30 40 50 60 70 80 90

Page 62: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

webWorkers

Angular 2

Target

0 10 20 30 40 50 60 70 80 90

Page 63: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 64: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Кол-во перерисовок в секунду (больше лучше)

Angular 1

Angular 2

React

Elm

0 10 20 30 40 50 60 70 80 90

Page 65: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Еще раз• enableProd() • trackBy • AOT • WebWorkers

Page 66: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Заглянем под капот

Page 67: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Scott Hanselman

Page 68: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

ZoneJs

Page 69: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 70: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

const http = require('http');

const hostname = '127.0.0.1'; const port = 3000;

const server = http.createServer((req, res) => { res.statusCode = 200; res.setHeader('Content-Type', 'text/plain'); res.end('Hello World'); });

server.listen(port, hostname, () => { console.log(`Server running at http://${hostname}:${port}/`); });

Page 71: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 72: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

process.on('uncaughtException', (err) => { console.log(`Caught exception: ${err}`); });

Page 73: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 74: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Zone.current.fork({}).run(function () { Zone.current.inTheZone = true; setTimeout(someCallback, 0); });

function someCallback() { console.log(Zone.current.inTheZone); }

setTimeout(someCallback, 0);

Page 75: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Zone.current.fork({}).run(function () { Zone.current.inTheZone = true; setTimeout(someCallback, 0); });

function someCallback() { console.log(Zone.current.inTheZone); }

setTimeout(someCallback, 0);

Page 76: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Zone.current.fork({}).run(function () { Zone.current.inTheZone = true; setTimeout(someCallback, 0); });

function someCallback() { console.log(Zone.current.inTheZone); }

setTimeout(someCallback, 0);

Page 77: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Zone.current.fork({}).run(function () { Zone.current.inTheZone = true; setTimeout(someCallback, 0); });

function someCallback() { console.log(Zone.current.inTheZone); }

setTimeout(someCallback, 0);

Page 78: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Zone.current.fork({}).run(function () { Zone.current.inTheZone = true; setTimeout(someCallback, 0); });

function someCallback() { console.log(Zone.current.inTheZone); // TRUE }

setTimeout(someCallback, 0);

Page 79: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Zone.current.fork({}).run(function () { Zone.current.inTheZone = true; setTimeout(someCallback, 0); });

function someCallback() { console.log(Zone.current.inTheZone); }

setTimeout(someCallback, 0);

Page 80: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Zone.current.fork({}).run(function () { Zone.current.inTheZone = true; setTimeout(someCallback, 0); });

function someCallback() { console.log(Zone.current.inTheZone); // FALSE }

setTimeout(someCallback, 0);

Page 81: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Change Detection

Page 82: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 83: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 84: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 85: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 86: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 87: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

// very simplified version of actual source class ApplicationRef {

changeDetectorRefs:ChangeDetectorRef[] = [];

constructor(private zone: NgZone) { this.zone.onTurnDone .subscribe(() => {

this.zone.run(() => this.tick() });

}

tick() { this.changeDetectorRefs .forEach((ref) => ref.detectChanges()); } }

Page 88: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

// very simplified version of actual source class ApplicationRef {

changeDetectorRefs:ChangeDetectorRef[] = [];

constructor(private zone: NgZone) { this.zone.onTurnDone .subscribe(() => {

this.zone.run(() => this.tick() });

}

tick() { this.changeDetectorRefs .forEach((ref) => ref.detectChanges()); } }

Page 89: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

// very simplified version of actual source class ApplicationRef {

changeDetectorRefs:ChangeDetectorRef[] = [];

constructor(private zone: NgZone) { this.zone.onTurnDone .subscribe(() => {

this.zone.run(() => this.tick() });

}

tick() { this.changeDetectorRefs .forEach((ref) => ref.detectChanges()); } }

Page 90: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

// very simplified version of actual source class ApplicationRef {

changeDetectorRefs:ChangeDetectorRef[] = [];

constructor(private zone: NgZone) { this.zone.onTurnDone .subscribe(() => {

this.zone.run(() => this.tick() });

}

tick() { this.changeDetectorRefs .forEach((ref) => ref.detectChanges()); } }

Page 91: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 92: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

@Component({ template: '<v-card [vData]="vData"></v-card>' }) class VCardApp {

constructor() { this.vData = { name: 'Christoph Burgdorf', email: '[email protected]' } }

changeData() { this.vData.name = 'Pascal Precht'; } }

Page 93: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

@Component({ template: ` <h2>{{vData.name}}</h2> <span>{{vData.email}}</span> ` }) class VCardCmp { @Input() vData; }

Page 94: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

@Component({ template: '<v-card [vData]="vData"></v-card>' }) class VCardApp {

constructor() { this.vData = { name: 'Christoph Burgdorf', email: '[email protected]' } }

changeData() { this.vData = { name: 'Pascal Precht' }; } }

Page 95: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

@Component({ template: ` <h2>{{vData.name}}</h2> <span>{{vData.email}}</span> `, changeDetection: ChangeDetectionStrategy.OnPush }) class VCardCmp { @Input() vData; }

Page 96: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 97: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Управляем Zone и CD

Page 98: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

constructor(private zone: NgZone) {}

Page 99: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

processOutsideAngularZone() { this.progress = 0; this.zone.runOutsideAngular(() => { this.increaseProgress(() => { this.zone.run(() => { console.log('Outside Done!'); }); }); }); }

Page 100: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

processOutsideAngularZone() { this.progress = 0; this.zone.runOutsideAngular(() => { this.increaseProgress(() => { this.zone.run(() => { console.log('Outside Done!'); }); }); }); }

Page 101: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

constructor(private cd: ChangeDetectorRef) {}

Page 102: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

ngOnInit() { this.addItemStream.subscribe(() => { this.counter++; // application state changed this.cd.markForCheck(); // marks path }) } }

Page 103: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

А можно как-то попроще?

Page 104: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Redux

Page 105: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

ng2-redux ngrx/store

Page 106: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Mobx

Page 107: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

ng2-mobx

Page 108: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 109: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Улучшаем Perceived Performance

•Увеличивая реальную производительность

Page 110: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Улучшаем Perceived Performance

•Увеличивая реальную производительность •Замедляя реальную производительность

Page 111: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Улучшаем Perceived Performance

•Увеличивая реальную производительность •Замедляя реальную производительность •Грамотно перераспределяя нагрузку и ресурсы

Page 112: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 113: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

FRPfunctional reactive programming

Page 114: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

this.form.valueChanges .filter((value) => this.form.valid) .switchMap((value) => { return http.post(‘/api’, value) });

Page 115: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

this.form.valueChanges .debounce(500) .filter((value) => this.form.valid) .switchMap((value) => { return http.post(‘/api’, value) });

Page 116: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

this.form.valueChanges .debounce(500) .distinctUntilChanged() .filter((value) => this.form.valid) .switchMap((value) => { return http.post(‘/api’, value) });

Page 117: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

this.form.valueChanges .debounce(500) .distinctUntilChanged() .filter((value) => this.form.valid) .switchMap((value) => { return http.post(‘/api’, value) }).retryWhen(attempts => attempts .zip(Observable.range(1, 3), (_, i) => i) .flatMap((i: number) => { return Observable.timer(i * 1000); }) ))

Page 118: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Page 119: Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)

Алексей Охрименко

Twitter: @Ai_boy

IPONWEB

http://bit.ly/2eMOBjm