Performance: measure() method
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2017.
Note: This feature is available in Web Workers.
The measure() method creates a named PerformanceMeasure object representing a time measurement between two marks in the browser's performance timeline.
When measuring between two marks, there is a start mark and end mark, respectively. The named timestamp is referred to as a measure.
Syntax
measure(measureName)
measure(measureName, startMark)
measure(measureName, startMark, endMark)
measure(measureName, measureOptions)
measure(measureName, measureOptions, endMark)
If only measureName is specified, the start timestamp is set to zero, and the end timestamp (which is used to calculate the duration) is the value that would be returned by Performance.now().
You can use strings to identify PerformanceMark objects as start and end marks.
To only provide an endMark, you need to provide an empty measureOptions object:
performance.measure("myMeasure", {}, "myEndMarker").
Parameters
measureName-
A string representing the name of the measure.
measureOptionsOptional-
An object that may contain measure options.
detailOptional-
Arbitrary metadata to be included in the measure. Defaults to
null. Must be structured-cloneable. startOptional-
Timestamp (
DOMHighResTimeStamp) to be used as the start time, or string that names aPerformanceMarkto use for the start time.If this is a string naming a
PerformanceMark, then it is defined in the same way asstartMark. durationOptional-
Duration (in milliseconds) between the start and end mark times. If omitted, this defaults to
performance.now(); the time that has elapsed since the context was created. If provided, you must also specify eitherstartorendbut not both. endOptional-
Timestamp (
DOMHighResTimeStamp) to be used as the end time, or string that names aPerformanceMarkto use for the end time.If this is a string naming a
PerformanceMark, then it is defined in the same way asendMark.
startMarkOptional-
A string naming a
PerformanceMarkin the performance timeline. ThePerformanceEntry.startTimeproperty of this mark will be used for calculating the measure. endMarkOptional-
A string naming a
PerformanceMarkin the performance timeline. ThePerformanceEntry.startTimeproperty of this mark will be used for calculating the measure. If you want to pass this argument, you must also pass eitherstartMarkor an emptymeasureOptionsobject.
Return value
The PerformanceMeasure entry that was created.
The returned measure will have the following property values:
-
entryType- set to"measure". -
name- set to thenameargument. -
startTime- set to:- a
timestamp, if specified inmeasureOptions.start. - the
timestampof a start mark, if specified inmeasureOptions.startorstartMark - a timestamp calculated from the
measureOptions.endandmeasureOptions.duration(ifmeasureOptions.startwas not specified) - 0, if it isn't specified and can't be determined from other values.
- a
-
duration- set to aDOMHighResTimeStampthat is the duration of the measure calculated by subtracting thestartTimefrom the end timestamp.The end timestamp is one of:
- a
timestamp, if specified inmeasureOptions.end. - the
timestampof an end mark, if one is specified inmeasureOptions.endorendMark - a timestamp calculated from the
measureOptions.startandmeasureOptions.duration(ifmeasureOptions.endwas not specified) - the value returned by
Performance.now(), if no end mark is specified or can be determined from other values.
- a
-
detail- set to the value passed inmeasureOptions.
Exceptions
TypeError-
This can be thrown in any case where the start, end or duration might be ambiguous:
- Both
endMarkandmeasureOptionsare specified. measureOptionsis specified withdurationbut without specifying eitherstartorend.measureOptionsis specified with all ofstart,end, andduration.
- Both
SyntaxErrorDOMException-
The named mark does not exist.
- An end mark is specified using either
endMarkormeasureOptions.end, but there is noPerformanceMarkin the performance buffer with the matching name. - An end mark is specified using either
endMarkormeasureOptions.end, but it cannot be converted to match that of a read only attribute in thePerformanceTiminginterface. - A start mark is specified using either
startMarkormeasureOptions.start, but there is noPerformanceMarkin the performance buffer with the matching name. - A start mark is specified using either
startMarkormeasureOptions.start, but it cannot be converted to match that of a read only attribute in thePerformanceTiminginterface.
- An end mark is specified using either
DataCloneErrorDOMException-
The
measureOptions.detailvalue is non-nulland cannot be serialized using the HTML "StructuredSerialize" algorithm. RangeError-
The
measureOptions.detailvalue is non-nulland memory cannot be allocated during serialization using the HTML "StructuredSerialize" algorithm.
Examples
>Measuring duration between named markers
Given two of your own markers "login-started" and "login-finished", you can create a measurement called "login-duration" as shown in the following example. The returned PerformanceMeasure object will then provide a duration property to tell you the elapsed time between the two markers.
const loginMeasure = performance.measure(
"login-duration",
"login-started",
"login-finished",
);
console.log(loginMeasure.duration);
Measuring duration with custom start and end times
To do more advanced measurements, you can pass a measureOptions parameter. For example, you can use the event.timeStamp property from a click event as the start time.
performance.measure("login-click", {
start: myClickEvent.timeStamp,
end: myMarker.startTime,
});
Providing additional measurement details
You can use the details property to provide additional information of any type. Maybe you want to record which HTML element was clicked, for example.
performance.measure("login-click", {
detail: { htmlElement: myElement.id },
start: myClickEvent.timeStamp,
end: myMarker.startTime,
});
Specifications
| Specification |
|---|
| User Timing> # dom-performance-measure> |
Browser compatibility
Loading...