Skip to content

Performance Test

This example demonstrates the performance capabilities of the ng-diagram library by rendering 500 nodes arranged in a 25x20 grid with almost 500 connections.

import '@angular/compiler';
import { Component } from '@angular/core';
import {
initializeModel,
NgDiagramComponent,
provideNgDiagram,
type Edge,
type Node,
} from 'ng-diagram';
@Component({
imports: [NgDiagramComponent],
providers: [provideNgDiagram()],
template: ` <ng-diagram [model]="model" /> `,
styles: `
:host {
flex: 1;
display: flex;
height: 100%;
}
`,
})
export class NgDiagramPerformanceTestComponent {
model = initializeModel(this.generateModelData());
generateModelData() {
const nodes = this.generateNodes();
const edges = this.generateEdges(nodes);
return {
metadata: {
viewport: { x: 50, y: 130, scale: 0.1 },
},
nodes,
edges,
};
}
private generateNodes(): Node<Data>[] {
const spacingX = 250;
const spacingY = 120;
const rows = 20;
const columns = 25;
const arrayLength = rows * columns;
return Array.from({ length: arrayLength }, (_, index) => {
const row = Math.floor(index / columns);
const column = index % columns;
const x = column * spacingX;
const y = row * spacingY;
const id =
row % 2 === 0
? row * columns + column + 1
: row * columns + (columns - column);
return {
id: `${id}`,
position: { x, y },
data: { label: `Node ${id}`, row },
};
}).sort((a, b) => Number(a.id) - Number(b.id));
}
private generateEdges(nodes: Node<Data>[]): Edge[] {
return nodes.slice(0, -1).map((node, index) => {
const next = nodes[index + 1];
return {
id: `edge-${node.id}`,
source: node.id,
target: next.id,
sourcePort: node.data.row % 2 === 0 ? 'port-right' : 'port-left',
targetPort: next.data.row % 2 === 0 ? 'port-left' : 'port-right',
data: {},
};
});
}
}
type Data = {
label: string;
row: number;
};