Skip to content

Commit

Permalink
perf(ext/web): optimize performance.measure()
Browse files Browse the repository at this point in the history
Optimizes the case when `performance.measure()` needs to find the
startMark by name, by avoiding copying and reversing the complete
entries list.
  • Loading branch information
esroyo committed Sep 20, 2024
1 parent 471a15e commit f6a2899
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 7 deletions.
13 changes: 6 additions & 7 deletions ext/web/15_performance.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@
import { primordials } from "ext:core/mod.js";
const {
ArrayPrototypeFilter,
ArrayPrototypeFind,
ArrayPrototypePush,
ArrayPrototypeReverse,
ArrayPrototypeSlice,
ObjectKeys,
ObjectPrototypeIsPrototypeOf,
ReflectHas,
Expand Down Expand Up @@ -101,10 +98,12 @@ function findMostRecent(
name,
type,
) {
return ArrayPrototypeFind(
ArrayPrototypeReverse(ArrayPrototypeSlice(performanceEntries)),
(entry) => entry.name === name && entry.entryType === type,
);
for (let i = performanceEntries.length - 1; i >= 0; --i) {
const entry = performanceEntries[i];
if (entry.name === name && entry.entryType === type) {
return entry;
}
}
}

function convertMarkToTimestamp(mark) {
Expand Down
55 changes: 55 additions & 0 deletions tests/unit/performance_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import {
assert,
assertEquals,
assertNotEquals,
assertNotStrictEquals,
assertStringIncludes,
assertThrows,
Expand Down Expand Up @@ -36,6 +37,41 @@ Deno.test(function performanceToJSON() {
assertEquals(Object.keys(json).length, 1);
});

Deno.test(function clearMarks() {
performance.mark("a");
performance.mark("a");
performance.mark("b");
performance.mark("c");

const marksNum = performance.getEntriesByType("mark").length;

performance.clearMarks("a");
assertEquals(performance.getEntriesByType("mark").length, marksNum - 2);

performance.clearMarks();
assertEquals(performance.getEntriesByType("mark").length, 0);
});

Deno.test(function clearMeasures() {
performance.measure("from-start");
performance.mark("a");
performance.measure("from-mark-a", "a");
performance.measure("from-start");
performance.measure("from-mark-a", "a");
performance.mark("b");
performance.measure("between-a-and-b", "a", "b");

const measuresNum = performance.getEntriesByType("measure").length;

performance.clearMeasures("from-start");
assertEquals(performance.getEntriesByType("measure").length, measuresNum - 2);

performance.clearMeasures();
assertEquals(performance.getEntriesByType("measure").length, 0);

performance.clearMarks();
});

Deno.test(function performanceMark() {
const mark = performance.mark("test");
assert(mark instanceof PerformanceMark);
Expand Down Expand Up @@ -127,6 +163,25 @@ Deno.test(function performanceMeasure() {
});
});

Deno.test(function performanceMeasureUseMostRecentMark() {
const markName1 = "mark1";
const measureName1 = "measure1";
const mark1 = performance.mark(markName1);
return new Promise((resolve, reject) => {
setTimeout(() => {
try {
const laterMark1 = performance.mark(markName1);
const measure1 = performance.measure(measureName1, markName1);
assertNotEquals(mark1.startTime, measure1.startTime);
assertEquals(laterMark1.startTime, measure1.startTime);
} catch (e) {
return reject(e);
}
resolve();
}, 100);
});
});

Deno.test(function performanceCustomInspectFunction() {
assertStringIncludes(Deno.inspect(performance), "Performance");
assertStringIncludes(
Expand Down

0 comments on commit f6a2899

Please sign in to comment.