date-fns-hijri/.github/wiki/benchmarks/index.md

66 lines
2.1 KiB
Markdown

# Benchmarks
Performance measurements for date-fns-hijri on Node.js 24, Apple M-series hardware.
## Methodology
All benchmarks use `performance.now()` with 10,000 iterations per test. The first 100 iterations are discarded as warm-up. Results are median across 5 runs.
```typescript
import { toHijriDate, fromHijriDate, formatHijriDate, addHijriMonths } from 'date-fns-hijri';
const date = new Date(2023, 2, 23);
const N = 10_000;
const t0 = performance.now();
for (let i = 0; i < N; i++) toHijriDate(date);
const elapsed = performance.now() - t0;
console.log(`toHijriDate: ${(elapsed / N * 1000).toFixed(1)} µs/call`);
```
## Results
| Function | µs/call | Notes |
| --- | --- | --- |
| `toHijriDate` (UAQ) | ~0.4 | Table lookup + binary search |
| `toHijriDate` (FCNA) | ~12 | Astronomical calculation via hijri-core |
| `fromHijriDate` (UAQ) | ~0.5 | Reverse table lookup |
| `fromHijriDate` (FCNA) | ~13 | Reverse astronomical calculation |
| `formatHijriDate` | ~1.2 | Includes `toHijriDate` + token replacement |
| `addHijriMonths` | ~1.8 | Includes conversion in both directions |
| `getHijriMonthName` | ~0.02 | Array index lookup |
## Bundle size
Measured with esbuild (min+gz), hijri-core as external:
| Build | Raw | Min | Min+gz |
| --- | --- | --- | --- |
| ESM (index.mjs) | ~6.1 KB | ~2.8 KB | ~1.3 KB |
| CJS (index.cjs) | ~6.4 KB | ~3.0 KB | ~1.4 KB |
hijri-core itself adds approximately 40 KB (min+gz) as a peer dependency.
## Memory
The UAQ calendar table is loaded once by hijri-core and shared across all calls. The table occupies approximately 8 KB of heap after initial load. Subsequent conversions do not allocate new objects beyond the return value.
## Reproduction
To reproduce on your own hardware:
```bash
git clone https://github.com/acamarata/date-fns-hijri.git
cd date-fns-hijri
pnpm install
pnpm build
node -e "
import('./dist/index.mjs').then(({ toHijriDate }) => {
const d = new Date(2023, 2, 23);
const N = 10000;
const t = performance.now();
for (let i = 0; i < N; i++) toHijriDate(d);
console.log((performance.now() - t) / N * 1000, 'µs/call');
});
"
```