w new ERR_PERFORMANCE_MEASURE_INVALID_OPTIONS( 'Must not have options.start, options.end, and ' + 'options.duration specified'); } } if (endMark !== undefined) { end = getMark(endMark); } else if (optionsValid && end !== undefined) { end = getMark(end); } else if (optionsValid && start !== undefined && duration !== undefined) { end = getMark(start) + getMark(duration); } else { end = now(); } if (typeof startOrMeasureOptions === 'string') { start = getMark(startOrMeasureOptions); } else if (optionsValid && start !== undefined) { start = getMark(start); } else if (optionsValid && duration !== undefined && end !== undefined) { start = end - getMark(duration); } else { start = 0; } duration = end - start; return { start, duration }; } function measure(name, startOrMeasureOptions, endMark) { validateString(name, 'name'); const { start, duration, } = calculateStartDuration(startOrMeasureOptions, endMark); let detail = startOrMeasureOptions?.detail; detail = detail != null ? structuredClone(detail) : null; const measure = new PerformanceMeasure(name, start, duration, detail); enqueue(measure); return measure; } function clearMarkTimings(name) { if (name !== undefined) { name = `${name}`; if (nodeTimingReadOnlyAttributes.has(name)) throw new ERR_INVALID_ARG_VALUE('name', name); markTimings.delete(name); return; } markTimings.clear(); } module.exports = { PerformanceMark, PerformanceMeasure, clearMarkTimings, mark, measure, };