Skip to main content

Results: JavaScript

Detailed results per engine
Results for each benchmark run for each engine in all languages and settings

Long-Running Tasks (10 tasks)

When executing long-running tasks (fibo(33)), Windmill emerged as the fastest orchestrator overall, completing the full workflow in 0.935 seconds. Temporal followed closely at 0.966 seconds, while Windmill Dedicated took slightly longer at 1.077 seconds. Kestra, in contrast, lagged behind at 2.919 seconds, more than twice as slow as the top performers.

The execution phase dominated the runtime in this scenario, as expected for compute-intensive tasks. Windmill devoted 82.67% of its total time to execution, significantly higher than the others. Temporal also maintained a high execution ratio at 66.05%, while Kestra's share dropped to 60.98%. The overhead introduced by assignment and task transitions remained comparatively low for all orchestrators in this category.

This reinforces the expectation that for longer tasks, the engine's overhead fades into the background, and raw computational throughput takes precedence. Windmill's ability to maintain minimal assignment (5.78%) and transition (11.55%) times is a strong indicator of its lightweight orchestration layer. Temporal also performed well, though it incurred slightly more scheduling overhead. Windmill Dedicated's assignment time was higher at 22.19%, likely reflecting startup or handoff costs in a dedicated worker configuration, yet the system still completed the workflow with excellent overall timing.

KestraTemporalWindmillWindmill Dedicated
Total duration (in seconds)2.9190.9660.9351.077
Assignment0.778 (26.65%)0.067 (6.94%)0.054 (5.78%)0.239 (22.19%)
Execution1.780 (60.98%)0.638 (66.05%)0.773 (82.67%)0.765 (71.03%)
Transition0.361 (12.37%)0.261 (27.02%)0.108 (11.55%)0.073 (6.78%)

Lightweight Tasks (40 tasks)

When shifting to lightweight tasks using fibo(10) — with each task lasting around 10 milliseconds — the dynamics changed dramatically. In this scenario, orchestration efficiency became the bottleneck, as the time spent managing tasks often exceeded the time spent executing them.

Windmill Dedicated posted the fastest total runtime at 2.125 seconds, with Windmill right behind at 2.973 seconds. Temporal completed the flow in 3.063 seconds, while Kestra required 9.050 seconds—making it the slowest by a substantial margin.

Unlike the long-running task case, here the execution phase was only a minor part of the total runtime: Execution time accounted for just 9.72% for Windmill, 5.93% for Windmill Dedicated, 8.81% for Temporal, and 51.19% for Kestra.

These proportions confirm that engine overhead dominates lightweight workflows. Windmill and Windmill Dedicated both handled orchestration with high parallelism, but the dedicated setup incurred notably higher assignment overhead —84.05% of total time, compared to Windmill's 48.00%. Despite this, Windmill Dedicated still completed the full workflow quickly, likely due to parallel scheduling and nearly negligible transition time (10.02%).

Temporal, while maintaining decent overall timing, exhibited the highest transition overhead (55.17%), which may be attributed to workflow state persistence or slower task chaining under rapid-fire conditions.

Kestra underperformed again, consuming 30.69% of time in assignment and 18.12% in transition, along with longer-than-expected task execution durations. This suggests either less responsive workers or more rigid task dispatch intervals that cannot keep up with high-frequency scheduling even though we were using io.kestra.plugin.core.runner.Process rather than spawning a new container. Another notable difference is that Kestra's time to schedule the first task was the highest at 0.93 seconds, compared to the other orchestrators that were close to each other (0.08s for Windmill, 0.04s for Windmill Dedicated, 0.1s for Temporal).

KestraTemporalWindmillWindmill Dedicated
Total duration (in seconds)9.0503.0632.9732.125
Assignment2.777 (30.69%)1.103 (36.01%)1.427 (48.00%)1.786 (84.05%)
Execution4.633 (51.19%)0.270 (8.81%)0.289 (9.72%)0.126 (5.93%)
Transition1.640 (18.12%)1.690 (55.17%)1.257 (42.28%)0.213 (10.02%)