Benchmark

forceCalendar Benchmark

An honest, reproducible comparison between ForceCalendar and FullCalendar. We measure what can be fairly compared and clearly note what cannot.

FullCalendar is an excellent calendar library that powers thousands of applications. This benchmark is not a critique of FullCalendar — it exists to help developers in strict enterprise environments (Salesforce Locker Service, strict CSP) understand the trade-offs. forceCalendar was built for environments where most calendar libraries cannot run due to security restrictions, not to replace FullCalendar in general use.

Last run 2026-10-04 03:19:42 UTC
Node v24.19.0
Platform linux/x64

4 October 2026 dependency check: the benchmark package lock reports no known npm advisories. The dashboard lock reports 6 high-severity affected development/build package entries from one distinct braces advisory through Tailwind and the Next lint plugin, and zero in its production-only audit. These are dependency checks, not a security certification.

Raw results, dated verification notes and preserved earlier runs. Development-tool advisory.

ForceCalendar
@forcecalendar/core2.5.7
@forcecalendar/interface1.9.1
FullCalendar
@fullcalendar/core6.1.21
@fullcalendar/daygrid6.1.21
@fullcalendar/timegrid6.1.21
@fullcalendar/list6.1.21
@fullcalendar/rrule6.1.21
rrule2.8.1
1.81 MiB
ForceCalendar
2.96 MiB
FullCalendar
1.6x
Size Ratio
ForceCalendar Stack
PackageSize
@forcecalendar/core690.5 KiB
@forcecalendar/interface1.13 MiB
Total1.81 MiB
FullCalendar Stack
PackageSize
@fullcalendar/core1.79 MiB
@fullcalendar/daygrid197.5 KiB
@fullcalendar/timegrid231.6 KiB
@fullcalendar/list66.7 KiB
@fullcalendar/rrule26.2 KiB
rrule671.1 KiB
Total2.96 MiB

Installed size measured via du -sb node_modules/package. All packages installed from npm, not local builds. The selected package stacks include source, declarations and maps; this is not browser transfer size or a claim of feature parity.

ForceCalendar's built-in RecurrenceEngineV2 vs the standalone rrule library (v2.8.1). Both process the same UTC recurrence rules; every occurrence timestamp is checked before timing. Cold means new engine instances, warm means repeated cached queries. ForceCalendar returns event objects; rrule returns Dates, so allocation costs differ. Higher ops/sec is better. Overlapping reported sample uncertainty is labelled inconclusive. These measurements cover the listed UTC rules. Passing these cases does not establish full timezone or RFC correctness. Core 2.5.7 fixes the reproduced cross-host recurrence drift; legacy timezone-conversion metadata and instance-override limitations remain in the timezone contract.

PatternOccurrencesForceCalendar ops/srrule ops/sWinner
Daily for 1 year (cold)3651,833677FC (2.7x)
Daily for 1 year (warm)36512,41755,882rrule (4.5x)
Weekly (MWF) for 1 year (cold)1563,7343,383FC (1.1x)
Weekly (MWF) for 1 year (warm)15630,894134,646rrule (4.4x)
Monthly (15th) for 5 years (cold)607,2603,461FC (2.1x)
Monthly (15th) for 5 years (warm)6077,763373,391rrule (4.8x)
Yearly for 10 years (cold)1017,84910,547FC (1.7x)
Yearly for 10 years (warm)10334,4811,864,108rrule (5.6x)
Daily for 5 years (1825 occurrences) (cold)1,825419136FC (3.1x)
Daily for 5 years (1825 occurrences) (warm)1,8252,80811,779rrule (4.2x)

What we compare

  • +Bundle size -- installed node_modules footprint for the selected package stacks
  • +Recurrence expansion -- pure JS performance generating occurrences from RRULE patterns
  • +Reproducibility -- all benchmarks use tinybench with warmup, run on the same machine, same Node version

What we do not compare

  • --DOM rendering -- ForceCalendar core is DOM-free; FullCalendar renders directly. Apples to oranges.
  • --Memory usage -- different architectures make heap comparisons misleading
  • --Feature parity -- both libraries have capabilities the other does not; this is not a feature comparison

How we measure

  • 1.Bundle size is measured with du -sb on each package's node_modules/ directory. This is the installed size on disk, not minified or gzipped transfer size. All packages are installed fresh from npm.
  • 2.Recurrence is benchmarked with tinybench, which runs each function through a warmup phase then measures operations per second over multiple iterations. Tests assert complete UTC timestamp parity before timing. Cold runs create new instances for both libraries, but shared process/timezone caches remain warm; warm runs reuse cached results. ForceCalendar V2 returns event objects while rrule returns Dates. Patterns: daily (365 and 1825), weekly MWF (156), monthly on the 15th (60), and yearly (10).
  • 3.Published evidence — this release comparison is manually verified with exact package pins. A separate existing workflow schedules runs and listens for release events; check the package versions and run date above rather than assuming every new release is represented.

Results may vary across environments. The source code and runner are open source — verify the methodology and reproduce the results yourself.