import { performance } from "perf_hooks";
import { pipe, Effect } from "effect";
// Sync Variant
const fibonacciSync = (a: number): number => {
return a <= 1 ? a : fibonacciSync(a - 1) + fibonacciSync(a - 2);
};
// Promise Variant
const fibonacciPromise = async (a: number): Promise<number> => {
return a <= 1
? a
: (await fibonacciPromise(a - 1)) + (await fibonacciPromise(a - 2));
};
// Effect Variant
const fibonacciEffect = (a: number): Effect.Effect<number> =>
a <= 1
? Effect.succeed(a)
: pipe(
Effect.all([fibonacciEffect(a - 1), fibonacciEffect(a - 2)]),
Effect.map(([a, b]) => a + b)
);
// Benchmark function
const benchmark = async (name: string, fn: () => Promise<number>) => {
const start = performance.now();
const result = await fn();
const end = performance.now();
console.log(
`${name}: Result = ${result}, Time = ${(end - start).toFixed(2)}ms`
);
};
const n = 30;
// Execute benchmarks
(async () => {
await benchmark("Sync", () => Promise.resolve(fibonacciSync(n)));
await benchmark("Promise", () => fibonacciPromise(n));
await benchmark("Effect (promise)", () =>
Effect.runPromise(fibonacciEffect(n))
);
await benchmark("Effect (sync)", () =>
Promise.resolve(Effect.runSync(fibonacciEffect(n)))
);
})();
import { performance } from "perf_hooks";
import { pipe, Effect } from "effect";
// Sync Variant
const fibonacciSync = (a: number): number => {
return a <= 1 ? a : fibonacciSync(a - 1) + fibonacciSync(a - 2);
};
// Promise Variant
const fibonacciPromise = async (a: number): Promise<number> => {
return a <= 1
? a
: (await fibonacciPromise(a - 1)) + (await fibonacciPromise(a - 2));
};
// Effect Variant
const fibonacciEffect = (a: number): Effect.Effect<number> =>
a <= 1
? Effect.succeed(a)
: pipe(
Effect.all([fibonacciEffect(a - 1), fibonacciEffect(a - 2)]),
Effect.map(([a, b]) => a + b)
);
// Benchmark function
const benchmark = async (name: string, fn: () => Promise<number>) => {
const start = performance.now();
const result = await fn();
const end = performance.now();
console.log(
`${name}: Result = ${result}, Time = ${(end - start).toFixed(2)}ms`
);
};
const n = 30;
// Execute benchmarks
(async () => {
await benchmark("Sync", () => Promise.resolve(fibonacciSync(n)));
await benchmark("Promise", () => fibonacciPromise(n));
await benchmark("Effect (promise)", () =>
Effect.runPromise(fibonacciEffect(n))
);
await benchmark("Effect (sync)", () =>
Promise.resolve(Effect.runSync(fibonacciEffect(n)))
);
})();