Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 명세는 웹 개발자가 고정밀 타임스탬프에 접근할 수 있게 하여 애플리케이션의 성능을 측정하는 데 도움을 주는 인터페이스를 정의합니다.
이 절은 이 문서가 발행된 시점의 문서 상태를 설명합니다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있습니다.
이 User Timing 명세는 [USER-TIMING-2]를 대체하기 위한 것이며, 다음을 포함합니다.
이 문서는 Web Performance Working Group이 권고안 트랙을 사용하여 후보 권고안 초안으로 발행했습니다.
후보 권고안으로의 발행은 W3C와 그 회원들의 승인을 의미하지 않습니다. 후보 권고안 초안은 작업 그룹이 이후의 후보 권고안 스냅샷에 포함하려는 이전 후보 권고안의 변경 사항을 통합합니다.
이 문서는 초안 문서이며, 언제든지 다른 문서로 갱신, 대체 또는 폐기될 수 있습니다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 적절하지 않습니다.
이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었습니다. W3C는 해당 그룹의 산출물과 관련하여 이루어진 특허 공개의 공개 목록을 유지합니다. 해당 페이지에는 특허 공개 방법에 대한 지침도 포함되어 있습니다. 개인이 해당 개인이 보기에 필수 청구항을 포함하는 특허에 대한 실제 지식을 가지고 있는 경우, W3C 특허 정책의 6절에 따라 해당 정보를 공개해야 합니다.
이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받습니다.
이 절은 비규범적입니다.
웹 개발자는 애플리케이션의 성능 특성을 평가하고 이해할 수 있어야 합니다.
JavaScript [ECMA-262]는
애플리케이션 지연 시간을 측정하는 메커니즘(Date.now() 메서드에서 현재 타임스탬프 가져오기)을 제공하지만,
이 타임스탬프의 정밀도는 사용자 에이전트마다 다릅니다.
이 문서는 PerformanceMark 및 PerformanceMeasure 인터페이스와
Performance 인터페이스에 대한 확장을 정의하며,
이들은 고정밀의 단조 증가 타임스탬프를 노출하여 개발자가 애플리케이션의 성능 특성을
더 잘 측정할 수 있게 합니다.
다음 스크립트는 개발자가 이 문서에서 정의한 인터페이스를 사용하여 개발자 스크립트와 관련된 타이밍 데이터를 얻는 방법을 보여줍니다.
async function run() {
performance.mark("startTask1");
await doTask1(); // Some developer code
performance.mark("endTask1");
performance.mark("startTask2");
await doTask2(); // Some developer code
performance.mark("endTask2");
// Log them out
const entries = performance.getEntriesByType("mark");
for (const entry of entries) {
console.table(entry.toJSON());
}
}
run();
[PERFORMANCE-TIMELINE-2]는 기록된 메트릭을
가져오는 데 사용할 수 있는 두 가지 메커니즘을 정의합니다. getEntries()
및 getEntriesByType() 메서드와
PerformanceObserver 인터페이스입니다. 전자는 특정 시점에
이름으로 특정 메트릭을 가져오려는 경우에 가장 적합하며, 후자는
새 메트릭이 사용 가능해질 때 알림을 받고자 하는 경우에 최적화되어 있습니다.
또 다른 예로, 클릭하면 새 콘텐츠를 가져오고 가져오기가 완료되었음을 표시하는 요소가 있다고 가정합니다. 사용자가 클릭한 시점부터 가져오기가 완료된 시점까지의 시간을 보고하고자 합니다. 클릭 핸들러가 실행되는 시간을 표시할 수는 없습니다. 그러면 이벤트를 처리하는 데 걸린 지연 시간을 놓치게 되므로, 대신 이벤트의 하드웨어 타임스탬프를 사용합니다. 또한 더 자세한 분석을 위해 컴포넌트의 이름도 알고자 합니다.
element.addEventListener("click", e => {
const component = getComponent(element);
fetch(component.url).then(() => {
element.textContent = "Updated";
const updateMark = performance.mark("update_component", {
detail: {component: component.name},
});
performance.measure("click_to_update_component", {
detail: {component: component.name},
start: e.timeStamp,
end: updateMark.startTime,
});
});
});
비규범적으로 표시된 절뿐만 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고는 비규범적입니다. 이 명세의 그 밖의 모든 내용은 규범적입니다.
이 문서의 핵심 단어 MAY와 MUST는 여기에 표시된 것처럼 모두 대문자로 나타날 때, 그리고 그럴 때에만, BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석해야 합니다.
일부 적합성 요구사항은 속성, 메서드 또는 객체에 대한 요구사항으로 표현됩니다. 이러한 요구사항은 사용자 에이전트에 대한 요구사항으로 해석해야 합니다.
이 명세의 IDL 조각은 Web IDL 명세에 설명된 것처럼, 적합한 IDL 조각에 필요한 것으로 해석해야 MUST 합니다. [WEBIDL]
Performance
인터페이스에 대한 확장
Performance 인터페이스와
DOMHighResTimeStamp는
[HR-TIME-2]에서 정의됩니다.
PerformanceEntry
인터페이스는 [PERFORMANCE-TIMELINE-2]에서 정의됩니다.
WebIDLdictionary PerformanceMarkOptions {
any detail;
DOMHighResTimeStamp startTime;
};
dictionary PerformanceMeasureOptions {
any detail;
(DOMString or DOMHighResTimeStamp) start;
DOMHighResTimeStamp duration;
(DOMString or DOMHighResTimeStamp) end;
};
partial interface Performance {
PerformanceMark mark(DOMString markName, optional PerformanceMarkOptions markOptions = {});
undefined clearMarks(optional DOMString markName);
PerformanceMeasure measure(DOMString measureName, optional (DOMString or PerformanceMeasureOptions) startOrMeasureOptions = {}, optional DOMString endMark);
undefined clearMeasures(optional DOMString measureName);
};
연결된 이름과 함께 타임스탬프("mark")를 저장합니다. 이 메서드는 다음 단계를 실행해야 MUST 합니다.
detailstartTime연결된 이름을 가진 저장된 타임스탬프를 제거합니다. 이 메서드는 다음 단계를 실행해야 MUST 합니다.
PerformanceMark
객체를 모두 performance
entry buffer에서 제거합니다.PerformanceMark 객체 중
performance
entry buffer에 나열되어 있고 그 name이 markName인
객체를 모두 제거합니다.
두 mark 사이의 DOMHighResTimeStamp
지속 시간과 연결된 이름("measure")을 저장합니다. 이 메서드는 다음 단계를 실행해야
MUST 합니다.
PerformanceMeasureOptions
객체이고 start, end, duration 및 detail 중 적어도 하나가
존재하면,
다음 검사를 실행합니다.
PerformanceMeasureOptions
객체이며, 그 end 멤버가 존재하면,
end time을 startOrMeasureOptions의 end를 전달하여
mark를 timestamp로 변환
알고리즘을 실행한 결과로 둡니다.
PerformanceMeasureOptions
객체이며, 그 start 및 duration
멤버가 둘 다 존재하면:
start를
전달하여 mark를
timestamp로 변환 알고리즘을 실행한 결과로 둡니다.
duration을
전달하여 mark를
timestamp로 변환 알고리즘을 실행한 결과로 둡니다.
Performance 객체의 now()
메서드가 반환할 값으로 둡니다.
PerformanceMeasureOptions
객체이고, 그 start 멤버가 존재하면,
start time을 startOrMeasureOptions의 start를 전달하여
mark를 timestamp로 변환
알고리즘을 실행한 결과로 둡니다.
PerformanceMeasureOptions
객체이며, 그 duration 및
end 멤버가 둘 다
존재하면:
duration을
전달하여 mark를
timestamp로 변환 알고리즘을 실행한 결과로 둡니다.
end를
전달하여 mark를
timestamp로 변환 알고리즘을 실행한 결과로 둡니다.DOMString이면,
start time을 startOrMeasureOptions를 전달하여 mark를 timestamp로 변환
알고리즘을 실행한 결과로 둡니다.
0으로 둡니다.PerformanceMeasure 객체
(entry)를 this의 관련
렘으로 새로 만듭니다.name 속성을 measureName으로 설정합니다.entryType 속성을 DOMString "measure"로 설정합니다.
startTime 속성을 start time으로 설정합니다.duration 속성을 start
time부터 end time까지의 지속 시간으로 설정합니다. 그 결과 지속 시간 값은
음수일 수 MAY 있습니다.detail 속성을 다음과 같이 설정합니다.
PerformanceMeasureOptions
객체이고 startOrMeasureOptions의 detail 멤버가
존재하면:
detail에
StructuredSerialize
알고리즘을 호출한 결과로 둡니다.
detail을
record 및 현재
렘에 StructuredDeserialize
알고리즘을 호출한 결과로 설정합니다.
null로 설정합니다.detailstartdurationend연결된 이름을 가진 저장된 타임스탬프를 제거합니다. 이 메서드는 다음 단계를 실행해야 MUST 합니다.
PerformanceMeasure 객체를 모두 performance
entry buffer에서 제거합니다.PerformanceMeasure 객체 중
performance
entry buffer에 나열되어 있고 그 name이 measureName인
객체를 모두 제거합니다.
PerformanceMark 인터페이스는
Performance 인터페이스의 mark() 메서드를 통해 생성된 mark도
Performance
Timeline에 노출합니다.
WebIDL[Exposed=(Window,Worker)]
interface PerformanceMark : PerformanceEntry {
constructor(DOMString markName, optional PerformanceMarkOptions markOptions = {});
readonly attribute any detail;
};
PerformanceMark 인터페이스는
PerformanceEntry
인터페이스의 다음 속성을 확장합니다.
name 속성은 mark의 이름을 반환해야 합니다.
entryType 속성은 DOMString "mark"를
반환해야 합니다.
startTime 속성은 mark의 시간 값을 가진 DOMHighResTimeStamp를
반환해야 합니다.
duration 속성은 값이 0인 DOMHighResTimeStamp를
반환해야 합니다.
PerformanceMark 인터페이스에는 다음 추가 속성이
포함됩니다.
detail
속성은 설정된 값을 반환해야 합니다(이는 PerformanceMarkOptions 딕셔너리에서 복사됩니다).
PerformanceMark 생성자
PerformanceMark 생성자는 다음 단계를 실행해야 합니다.
Window 객체이고 markName이
PerformanceTiming
인터페이스의 읽기 전용 속성과 같은
이름을 사용하는 경우, throw a SyntaxError.
PerformanceMark 객체
(entry)를 현재
전역 객체의 렘으로
새로 만듭니다.
name 속성을 markName으로 설정합니다.entryType 속성을 DOMString "mark"로 설정합니다.startTime 속성을 다음과 같이 설정합니다.
duration 속성을 0으로 설정합니다.detail이 null이면,
entry의 detail을
null로 설정합니다.
detail에 StructuredSerialize
알고리즘을 호출한 결과로 둡니다.detail을
record 및 현재
렘에 StructuredDeserialize
알고리즘을 호출한 결과로 설정합니다.
PerformanceMeasure 인터페이스는
Performance 인터페이스의 measure() 메서드를 통해 생성된
measure도 Performance
Timeline에
노출합니다.
WebIDL[Exposed=(Window,Worker)]
interface PerformanceMeasure : PerformanceEntry {
readonly attribute any detail;
};
PerformanceMeasure 인터페이스는
PerformanceEntry
인터페이스의 다음 속성을 확장합니다.
name 속성은 measure의 이름을 반환해야 합니다.
entryType 속성은 DOMString
"measure"를 반환해야 합니다.
startTime 속성은 measure의 시작 mark를 가진 DOMHighResTimeStamp를
반환해야 합니다.
duration 속성은 measure의 지속 시간을 가진 DOMHighResTimeStamp를
반환해야 합니다.
PerformanceMeasure 인터페이스에는 다음 추가
속성이 포함됩니다.
detail 속성은 설정된 값을 반환해야 합니다(이는
PerformanceMeasureOptions 딕셔너리에서
복사됩니다).
User Timing API를 구현하는 사용자 에이전트는
supportedEntryTypes에 "mark"와
"measure"를 포함해야 합니다. 이를 통해 개발자는 User Timing 지원 여부를 감지할 수 있습니다.
DOMString 또는 DOMHighResTimeStamp인
mark가 주어졌을 때, mark를 timestamp로 변환하려면 다음 단계를 실행합니다.
DOMString이고
PerformanceTiming
인터페이스의 읽기 전용 속성과 같은 이름을 가지면,
end time을 name을 mark의 값으로 설정하여 name을 timestamp로 변환 알고리즘을 실행한 결과로 둡니다.
DOMString이면, end time을
performance
entry buffer 안의 PerformanceMark 객체 중
그 name이 mark인 가장 최근 항목의 startTime 속성 값으로 둡니다.
일치하는 항목을 찾을 수 없으면, throw a SyntaxError.
DOMHighResTimeStamp이면:
TypeError를
throw합니다.
PerformanceTiming
인터페이스의 읽기 전용
속성인 name이 주어졌을 때,
name을 timestamp로 변환하려면
다음 단계를 실행합니다.
Window 객체가 아니면, throw a TypeError.navigationStart이면, 0을 반환합니다.PerformanceTiming
인터페이스의 navigationStart 값으로 둡니다.
PerformanceTiming
인터페이스의 name 값으로 둡니다.
0이면, throw
an InvalidAccessError.
PerformanceTiming 인터페이스는 [NAVIGATION-TIMING]에서 정의되었으며 현재는 폐기된 것으로 간주됩니다. PerformanceTiming 인터페이스의 이름 사용은 하위 호환성을 유지하기 위해 지원되지만, 앞으로 이 기능을 [NAVIGATION-TIMING-2]에서 정의된 PerformanceNavigationTiming 인터페이스의 이름(또는 다른 인터페이스)으로 확장할 계획은 없습니다.
개발자는 공통 타이밍을 표시하기 위해 다음 권장 mark 이름을 사용하도록 권장됩니다. 사용자 에이전트는 이러한 이름의 사용이 그 설명에 적절하거나 일관적인지 검증하지 않습니다.
이러한 권장 mark 이름을 추가하면 성능 도구가 사이트에 맞게 안내를 조정하는 데 도움이 될 수 있습니다. 또한 이러한 mark 이름은 실제 사용자 모니터링 제공자와 사용자 에이전트가 애플리케이션 성능에 관한 웹 개발자 신호를 대규모로 수집하고, 사이트별 작업 없이도 이 정보를 개발자에게 표시하는 데 도움이 될 수 있습니다.
이 예제에서 페이지는 로딩 시 채팅 위젯, 검색 상자, 뉴스피드를 비동기적으로 초기화합니다. 완료되면 "mark_fully_loaded" mark 이름을 통해 실험실 도구와 분석 제공자가 타이밍을 자동으로 표시할 수 있습니다.
window.addEventListener("load", (event) => {
Promise.all([
loadChatWidget(),
initializeSearchAutocomplete(),
initializeNewsfeed()]).then(() => {
performance.mark('mark_fully_loaded');
});
});
detail
메타데이터는 다음을 포함하여 기능에 관한 유용한 정보를 담을 수 있습니다.
이 예제에서는 FancyJavaScriptFramework용 ImageOptimizationComponent가 최적 성능을 위해 이미지 크기를 조정하는 데 사용됩니다. 코드는 실험실 도구와 분석이 이 기능의 사용 여부와 성능 개선에 도움이 되었는지를 측정할 수 있도록 이 기능의 사용을 기록합니다.
performance.mark('mark_feature_usage', {
'detail': {
'feature': 'ImageOptimizationComponent',
'framework': 'FancyJavaScriptFramework'
}
})
이 절은 비규범적입니다.
이 명세에서 정의하는 인터페이스는 페이지의 특정 JavaScript 활동에 관한 잠재적으로 민감한 타이밍 정보를 노출합니다. 고해상도 타이밍 정보 노출에 관한 개인정보 보호 및 보안 고려사항은 [HR-TIME-2]를 참조하십시오.
웹 플랫폼은 페이지에 포함된 모든 스크립트가 어느 출처의 스크립트인지와 관계없이 같은 페이지에 포함된 다른 모든 스크립트와 동일한 접근 권한을 가진다는 불변 조건으로 설계되었기 때문에, 이 명세에서 정의하는 인터페이스는 기록된 타이밍 정보의 기록 또는 검색에 어떠한 제한도 두지 않습니다. 즉, 페이지에 포함된 어떤 스크립트가 기록한 user timing mark 또는 measure도 출처와 관계없이 같은 페이지에서 실행 중인 다른 모든 스크립트가 읽을 수 있습니다.
이 작업에 기여해 준 James Simonsen, Jason Weber, Nic Jansma, Philippe Le Hegaret, Karen Anderson, Steve Souders, Sigbjorn Vik, Todd Reifsteck, and Tony Gentilcore에게 감사드립니다.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: