挖掘代码并认为我会分享,因为这种解释似乎没有出现在任何地方。
看来 devtools 中的相关代码在这里:
https://source.chromium.org/chromium/chromium/src/+/main:out/Debug/gen/third_party/devtools-frontend/src/front_end/core/sdk/PerformanceMetricsModel.js;l=43?q=requestMetrics&ss=chromium%2Fchromium%2Fsrc
case "CumulativeTime" /* CumulativeTime */:
value = (data.lastTimestamp && data.lastValue) ?
Platform.NumberUtilities.clamp((metric.value - data.lastValue) * 1000 / (timestamp - data.lastTimestamp), 0, 1) :
0;
data.lastValue = metric.value;
data.lastTimestamp = timestamp;
break;
Devtools 正在轮询指标,这些指标似乎包含自启用指标以来花费在任务上的累积时间。 CPU 使用率是自上次请求指标以来所有任务所用时间的百分比。
随时间记录 CPU 使用率的示例代码:
interface CPUUsageSnapshot {
timestamp: number,
usage: number,
}
export interface CPUStats {
average: number,
snapshots: CPUUsageSnapshot[]
}
function processMetrics(metrics: GetMetricsResponse): {
timestamp: number,
activeTime: number
} {
const activeTime = metrics.metrics.filter(m => m.name.includes("Duration")).map(m => m.value).reduce((a, b) => a + b)
return {
timestamp: metrics.metrics.find(m => m.name === "Timestamp")?.value || 0,
activeTime
}
}
async function logMetrics(cdp: CDPSession, interval: number): Promise<() => Promise<CPUStats>> {
await cdp.send("Performance.enable", {
timeDomain: "timeTicks"
})
const { timestamp: startTime, activeTime: initialActiveTime } = processMetrics(await cdp.send("Performance.getMetrics"))
const snapshots: CPUUsageSnapshot[] = []
let cumulativeActiveTime = initialActiveTime
let lastTimestamp = startTime
const timer = setInterval(async () => {
const {timestamp, activeTime} = processMetrics(await cdp.send("Performance.getMetrics"))
const frameDuration = timestamp - lastTimestamp
let usage = (activeTime - cumulativeActiveTime) / frameDuration
cumulativeActiveTime = activeTime
if (usage > 1) usage = 1
snapshots.push({
timestamp,
usage
})
lastTimestamp = timestamp
}, interval)
return async () => {
clearInterval(timer)
await cdp.send("Performance.disable")
return {
average: cumulativeActiveTime / (lastTimestamp - startTime),
snapshots
}
}
}