Performance Utility
The Performance utility provides functions for measuring and logging the execution time of code blocks, which is useful for identifying bottlenecks and optimizing your application. All timing uses performance.now() (milliseconds).
executeWithPerformanceMeasure
This is a higher-order function that wraps a task (a function), automatically logging its start time, end time, and total execution duration. Returns a Promise that resolves to the task's return value.
executeWithPerformanceMeasure(opts)
opts(object):logger(Logger, optional): A logger instance to use for logging. Defaults toconsole.level(string, optional): The log level to use (e.g.,'debug','info'). Defaults to'debug'.description(string, optional): A description of the task being measured. Defaults to'Executing'.scope(string): A scope to identify the context of the measurement.task(Function): The function to be executed and measured. Can be sync or async (wrapped withPromise.resolve()).args(any, optional): Arguments to include in the log output for debugging purposes. When provided, they are logged as JSON (%jformat).
Example
The BaseApplication uses this utility to measure the time taken to register components, controllers, and data sources during the startup process.
typescript
// Inside BaseApplication class
import { executeWithPerformanceMeasure } from '@venizia/ignis-helpers';
// ...
async registerComponents() {
await executeWithPerformanceMeasure({
logger: this.logger,
scope: this.registerComponents.name,
description: 'Register application components',
task: async () => {
// ... logic to register components
},
});
}When registerComponents is called, it will produce log output similar to this:
[RegisterComponents] START | Register application components ...
[RegisterComponents] DONE | Register application components | Took: 12.3456 (ms)With args provided:
[RegisterComponents] START | Register application components... | Args: {"name":"auth"}
[RegisterComponents] DONE | Register application components | Args: {"name":"auth"} | Took: 12.3456 (ms)Low-Level Utilities
For more granular measurements, you can use the lower-level functions:
getPerformanceCheckpoint(): Returns a high-resolution timestamp fromperformance.now(), which you can use as a starting point.getExecutedPerformance(opts): Calculates the elapsed time in milliseconds since a given checkpoint. Rounds to 6 decimal places by default.opts.from(number): The starting checkpoint fromgetPerformanceCheckpoint().opts.digit(number, optional): Number of decimal places for rounding. Defaults to6.
Example
typescript
import { getPerformanceCheckpoint, getExecutedPerformance } from '@venizia/ignis-helpers';
const start = getPerformanceCheckpoint();
// ... perform some work
const duration = getExecutedPerformance({ from: start });
console.log(`The work took ${duration} ms.`);
// With custom precision
const preciseDuration = getExecutedPerformance({ from: start, digit: 2 });
console.log(`The work took ${preciseDuration} ms.`);