diff --git a/src/app/demo/demo.component.html b/src/app/demo/demo.component.html index 794db6e..d62362e 100644 --- a/src/app/demo/demo.component.html +++ b/src/app/demo/demo.component.html @@ -17,6 +17,7 @@
Angular Plotly
  • Timeout Update
  • Huge Memory Usage
  • Slow Example
  • +
  • Performance
  • diff --git a/src/app/demo/demo.module.ts b/src/app/demo/demo.module.ts index 80d2349..6cae6ed 100644 --- a/src/app/demo/demo.module.ts +++ b/src/app/demo/demo.module.ts @@ -23,6 +23,7 @@ import { FramesComponent } from './frames/frames.component'; import { TimeoutUpdateComponent } from './timeout-update/timeout-update.component'; import { HugeMemoryUsageComponent } from './huge-memory-usage/huge-memory-usage.component'; import { SlowExampleComponent } from './slow-example/slow-example.component'; +import { PerformanceComponent } from './performance/performance.component'; const demoRoutes: Routes = [ @@ -37,6 +38,7 @@ const demoRoutes: Routes = [ { path: 'timeout-update', component: TimeoutUpdateComponent, data: { title: 'Timeout Update' } }, { path: 'huge-memory-usage', component: HugeMemoryUsageComponent, data: { title: 'Huge Memory Usage' } }, { path: 'slow-example', component: SlowExampleComponent, data: { title: 'Slow example' } }, + { path: 'performance', component: PerformanceComponent, data: { title: 'Performance' } }, { path: '', redirectTo: '/home', pathMatch: 'full' }, ]; @@ -68,6 +70,7 @@ PlotlyViaCDNModule.plotlyVersion = '1.49.4'; TimeoutUpdateComponent, HugeMemoryUsageComponent, SlowExampleComponent, + PerformanceComponent, ], exports: [DemoComponent], }) diff --git a/src/app/demo/performance/performance.component.css b/src/app/demo/performance/performance.component.css new file mode 100644 index 0000000..1c1c231 --- /dev/null +++ b/src/app/demo/performance/performance.component.css @@ -0,0 +1,10 @@ +.grid { + display: grid; + grid-template-columns: repeat(5, 1fr); + grid-auto-rows: 225px; + gap: 4px; + + max-width: 1200px; + margin: 0 auto; + } + \ No newline at end of file diff --git a/src/app/demo/performance/performance.component.html b/src/app/demo/performance/performance.component.html new file mode 100644 index 0000000..7d2044e --- /dev/null +++ b/src/app/demo/performance/performance.component.html @@ -0,0 +1,12 @@ + +

    Total time: {{ getTotalTime() }}ms

    + +
    + +
    +
    Time: {{ getTime(i) }}ms
    + +
    + + +
    \ No newline at end of file diff --git a/src/app/demo/performance/performance.component.spec.ts b/src/app/demo/performance/performance.component.spec.ts new file mode 100644 index 0000000..1bdc919 --- /dev/null +++ b/src/app/demo/performance/performance.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PerformanceComponent } from './performance.component'; + +describe('PerformanceComponent', () => { + let component: PerformanceComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ PerformanceComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(PerformanceComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/demo/performance/performance.component.ts b/src/app/demo/performance/performance.component.ts new file mode 100644 index 0000000..7919e84 --- /dev/null +++ b/src/app/demo/performance/performance.component.ts @@ -0,0 +1,83 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'plotly-performance', + templateUrl: './performance.component.html', + styleUrls: ['./performance.component.css'] +}) +export class PerformanceComponent implements OnInit { + numberOfCharts = 100; + indexNumberOfCharts = this.numberOfCharts - 1; + + chartData = []; + layout: any; + style: any; + config: any; + + public mainStartTime: number; + public mainEndTime: number; + public startTime: number[] = []; + public endTime: number[] = []; + + constructor() { } + + ngOnInit(): void { + this.initChartSetup(); + this.initChartData(); + + this.mainStartTime = (new Date()).getTime(); + } + + trackByIndex(i) { + return i; + } + + initChartSetup() { + this.layout = { + xaxis: { title: { text: "X" }, automargin: true }, + yaxis: { title: { text: "Y" }, automargin: true }, + margin: { + t: 12, + r: 12, + b: 12, + l: 12 + } + }; + + this.style = { position: "relative", width: "100%", height: '200px' }; + + this.config = { staticPlot: true }; + } + + initChartData() { + for (let i = 1; i <= this.numberOfCharts; i++) { + const data = [ + { type: "bar", name: `Chart ${i}`, x: [1, 2, 3], y: [100, 300, 200] } + ]; + this.chartData.push(data); + } + } + + onNgInited(i: number) { + this.startTime[i] = (new Date()).getTime(); + } + + onInitialized(i: number) { + this.endTime[i] = (new Date()).getTime(); + + if (i === this.indexNumberOfCharts) { + this.mainEndTime = (new Date()).getTime(); + } + } + + getTime(i: number): number { + if (i in this.endTime) return this.endTime[i] - this.startTime[i]; + return 0; + } + + getTotalTime(): number { + if (this.mainEndTime) return this.mainEndTime - this.mainStartTime; + return 0; + } + +} diff --git a/src/app/shared/plot/plot.component.ts b/src/app/shared/plot/plot.component.ts index d684246..d7d1413 100644 --- a/src/app/shared/plot/plot.component.ts +++ b/src/app/shared/plot/plot.component.ts @@ -15,6 +15,7 @@ import { IterableDiffers, KeyValueDiffer, KeyValueDiffers, + ChangeDetectionStrategy, } from '@angular/core'; import { PlotlyService } from '../plotly.service'; @@ -25,6 +26,7 @@ import { Plotly } from '../plotly.interface'; selector: 'plotly-plot', template: `
    `, providers: [PlotlyService], + changeDetection: ChangeDetectionStrategy.OnPush }) export class PlotComponent implements OnInit, OnChanges, OnDestroy, DoCheck { protected defaultClassName = 'js-plotly-plot'; @@ -52,6 +54,7 @@ export class PlotComponent implements OnInit, OnChanges, OnDestroy, DoCheck { @Input() updateOnDataChange = true; @Input() updateOnlyWithRevision = false; + @Output() ngInited = new EventEmitter(); @Output() initialized = new EventEmitter(); @Output() update = new EventEmitter(); @Output() purge = new EventEmitter(); @@ -99,7 +102,9 @@ export class PlotComponent implements OnInit, OnChanges, OnDestroy, DoCheck { ) { } ngOnInit() { - this.createPlot().then(() => { + this.ngInited.emit(); + setTimeout(async () => { + await this.createPlot(); const figure = this.createFigure(); this.initialized.emit(figure); });