Licensed for testing and evaluation purposes. Please see the license agreement included in the sample project. You can use the source code of the tutorial if you are a licensed user of DayPilot Pro for JavaScript. Buy a license.

Live Demo

Performance Testing

This project should give you an idea on what to expect from the Scheduler in terms of client-side performance. It tests performance of the following phases:

1. Reading

All data in the input array need to be read. Reading the data is fast and 400,000 events can be read without any noticeable delay.

2. Loading


The Scheduler only reads data for the date range defined using startDate and days (visible in the grid). If you increase the date range the processing time starts to increase. You can test it by displaying 30/60/90/365/1000 days.

3. Rendering


The event rendering is optimized by default. The Scheduler only renders the current viewport, additional events are loaded during scrolling. This means the total number of events has minimal influence on the rendering speed.

Scheduler Data Set

The resources array has 400 items:


for (let i = 1; i <= 400; i++) {
    id: i,
    name: "Resource " + i

The events array has 400,000 items:


let start = new DayPilot.Date("2019-01-01");
for (let y = 1; y <= 400; y++) {
  for (let x = 0; x < 1000; x++) {
    let id = x + "_" + y;
      id: id,
      resource: y,
      start: start.addDays(x),
      end: start.addDays(x + 1),
      text: 'Scheduler Event ' + id

Please note that all data is generated on the client side. The test doesn't include time needed to receive the data from the server side:

  • querying the database
  • building the JSON response
  • sending the response over the network
  • parsing the JSON response

Returning 400,000 records would mean significant stress for the database.

The size of the JSON with all the event data is about 46 MB (48,788,001 bytes). If gzip compression is enabled, the size can be reduced to 4.8 MB. This still means significant download times (theoretical speed is 4s @ 10 Mbps).

Scheduler Configuration

The Scheduler uses the default configuration without additional performance tweaks. However, it uses direct API (instead of the config/events attributes) for loading events and resources:

ngAfterViewInit(): void {
  this.ds.getResources().subscribe(result => {
    this.scheduler.control.update({resources: result})

  const from = this.scheduler.control.visibleStart();
  const to = this.scheduler.control.visibleEnd();
  this.ds.getEvents(from, to).subscribe(result => {
    this.scheduler.control.update({events: result});

See also Angular Scheduler Performance.

On-Demand Loading


This testing Angular project focuses on raw client-side performance and it loads an extremely large data set at once. The Scheduler can handle a lot of data but it's not the only component of the final system. Loading large data sets at once has extreme demands on the server and network.

In real-world scenarios, it's much better to load the data in smaller chunks during scrolling

For more information, please see the following tutorial: