User Timing

W3C 후보 권고안 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/CRD-user-timing-20260311/
최신 공개 버전:
https://www.w3.org/TR/user-timing/
최신 편집자 초안:
https://w3c.github.io/user-timing/
이력:
https://www.w3.org/standards/history/user-timing
커밋 이력
테스트 스위트:
https://wpt.fyi/results/user-timing
구현 보고서:
https://wpt.fyi/results/user-timing
편집자:
Nicolás Peña Moreno (Google)
이전 편집자:
Ilya Grigorik (Google)
Jatinder Mann (Microsoft Corp.) (2014년 2월까지)
Zhiheng Wang (Google Inc.) (2013년 7월까지)
Anderson Quach (Microsoft Corp.) (2011년 3월까지)
피드백:
GitHub w3c/user-timing (풀 리퀘스트, 새 이슈, 열린 이슈)
public-web-perf@w3.org에 제목 줄 [UserTiming]을 사용하십시오 (아카이브)
구현
User Timing을 사용할 수 있나요?

초록

이 명세는 웹 개발자가 고정밀 타임스탬프에 접근할 수 있게 하여 애플리케이션의 성능을 측정하는 데 도움을 주는 인터페이스를 정의합니다.

이 문서의 상태

이 절은 이 문서가 발행된 시점의 문서 상태를 설명합니다. 현재 W3C 발행물 목록과 이 기술 보고서의 최신 개정판은 W3C 표준 및 초안 색인에서 확인할 수 있습니다.

이 User Timing 명세는 [USER-TIMING-2]를 대체하기 위한 것이며, 다음을 포함합니다.

이 문서는 Web Performance Working Group권고안 트랙을 사용하여 후보 권고안 초안으로 발행했습니다.

후보 권고안으로의 발행은 W3C와 그 회원들의 승인을 의미하지 않습니다. 후보 권고안 초안은 작업 그룹이 이후의 후보 권고안 스냅샷에 포함하려는 이전 후보 권고안의 변경 사항을 통합합니다.

이 문서는 초안 문서이며, 언제든지 다른 문서로 갱신, 대체 또는 폐기될 수 있습니다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 적절하지 않습니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었습니다. W3C는 해당 그룹의 산출물과 관련하여 이루어진 특허 공개의 공개 목록을 유지합니다. 해당 페이지에는 특허 공개 방법에 대한 지침도 포함되어 있습니다. 개인이 해당 개인이 보기에 필수 청구항을 포함하는 특허에 대한 실제 지식을 가지고 있는 경우, W3C 특허 정책의 6절에 따라 해당 정보를 공개해야 합니다.

이 문서는 2025년 8월 18일 W3C 프로세스 문서의 적용을 받습니다.

1. 소개

이 절은 비규범적입니다.

웹 개발자는 애플리케이션의 성능 특성을 평가하고 이해할 수 있어야 합니다. JavaScript [ECMA-262]는 애플리케이션 지연 시간을 측정하는 메커니즘(Date.now() 메서드에서 현재 타임스탬프 가져오기)을 제공하지만, 이 타임스탬프의 정밀도는 사용자 에이전트마다 다릅니다.

이 문서는 PerformanceMarkPerformanceMeasure 인터페이스와 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,
    });
  });
});

2. 적합성

비규범적으로 표시된 절뿐만 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고는 비규범적입니다. 이 명세의 그 밖의 모든 내용은 규범적입니다.

이 문서의 핵심 단어 MAYMUST는 여기에 표시된 것처럼 모두 대문자로 나타날 때, 그리고 그럴 때에만, BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석해야 합니다.

일부 적합성 요구사항은 속성, 메서드 또는 객체에 대한 요구사항으로 표현됩니다. 이러한 요구사항은 사용자 에이전트에 대한 요구사항으로 해석해야 합니다.

이 명세의 IDL 조각은 Web IDL 명세에 설명된 것처럼, 적합한 IDL 조각에 필요한 것으로 해석해야 MUST 합니다. [WEBIDL]

3. User Timing

3.1 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);
};

3.1.1 mark() 메서드

연결된 이름과 함께 타임스탬프("mark")를 저장합니다. 이 메서드는 다음 단계를 실행해야 MUST 합니다.

  1. PerformanceMark 생성자를 실행하고, 새로 생성된 객체를 entry로 둡니다.
  2. entry큐에 넣습니다.
  3. entryperformance entry buffer에 추가합니다.
  4. entry를 반환합니다.
3.1.1.1 PerformanceMarkOptions 딕셔너리
detail
mark에 포함될 메타데이터.
startTime
mark 시간으로 사용할 타임스탬프.

3.1.2 clearMarks() 메서드

연결된 이름을 가진 저장된 타임스탬프를 제거합니다. 이 메서드는 다음 단계를 실행해야 MUST 합니다.

  1. markName이 생략된 경우, PerformanceMark 객체를 모두 performance entry buffer에서 제거합니다.
  2. 그렇지 않으면, PerformanceMark 객체 중 performance entry buffer에 나열되어 있고 그 namemarkName인 객체를 모두 제거합니다.
  3. undefined를 반환합니다.

3.1.3 measure() 메서드

두 mark 사이의 DOMHighResTimeStamp 지속 시간과 연결된 이름("measure")을 저장합니다. 이 메서드는 다음 단계를 실행해야 MUST 합니다.

  1. startOrMeasureOptionsPerformanceMeasureOptions 객체이고 start, end, durationdetail 중 적어도 하나가 존재하면, 다음 검사를 실행합니다.
    1. endMark가 주어진 경우, throw a TypeError.
    2. startOrMeasureOptionsstartend 멤버가 둘 다 생략된 경우, throw a TypeError.
    3. startOrMeasureOptionsstart, durationend 멤버가 모두 존재하면, throw a TypeError.
  2. end time을 다음과 같이 계산합니다.
    1. endMark가 주어진 경우, end timeendMark를 전달하여 mark를 timestamp로 변환 알고리즘을 실행한 결과로 둡니다.
    2. 그렇지 않고, startOrMeasureOptionsPerformanceMeasureOptions 객체이며, 그 end 멤버가 존재하면, end timestartOrMeasureOptionsend를 전달하여 mark를 timestamp로 변환 알고리즘을 실행한 결과로 둡니다.
    3. 그렇지 않고, startOrMeasureOptionsPerformanceMeasureOptions 객체이며, 그 startduration 멤버가 둘 다 존재하면:
      1. startstart를 전달하여 mark를 timestamp로 변환 알고리즘을 실행한 결과로 둡니다.
      2. durationduration을 전달하여 mark를 timestamp로 변환 알고리즘을 실행한 결과로 둡니다.
      3. end timestart 더하기 duration으로 둡니다.
    4. 그렇지 않으면, end timePerformance 객체의 now() 메서드가 반환할 값으로 둡니다.
  3. start time을 다음과 같이 계산합니다.
    1. startOrMeasureOptionsPerformanceMeasureOptions 객체이고, 그 start 멤버가 존재하면, start timestartOrMeasureOptionsstart를 전달하여 mark를 timestamp로 변환 알고리즘을 실행한 결과로 둡니다.
    2. 그렇지 않고, startOrMeasureOptionsPerformanceMeasureOptions 객체이며, 그 durationend 멤버가 둘 다 존재하면:
      1. durationduration을 전달하여 mark를 timestamp로 변환 알고리즘을 실행한 결과로 둡니다.
      2. endend를 전달하여 mark를 timestamp로 변환 알고리즘을 실행한 결과로 둡니다.
      3. start timeend 빼기 duration으로 둡니다.
    3. 그렇지 않고, startOrMeasureOptionsDOMString이면, start timestartOrMeasureOptions를 전달하여 mark를 timestamp로 변환 알고리즘을 실행한 결과로 둡니다.
    4. 그렇지 않으면, start time0으로 둡니다.
  4. PerformanceMeasure 객체 (entry)를 this관련 렘으로 새로 만듭니다.
  5. entryname 속성을 measureName으로 설정합니다.
  6. entryentryType 속성을 DOMString "measure"로 설정합니다.
  7. entrystartTime 속성을 start time으로 설정합니다.
  8. entryduration 속성을 start time부터 end time까지의 지속 시간으로 설정합니다. 그 결과 지속 시간 값은 음수일 수 MAY 있습니다.
  9. entrydetail 속성을 다음과 같이 설정합니다.
    1. startOrMeasureOptionsPerformanceMeasureOptions 객체이고 startOrMeasureOptionsdetail 멤버가 존재하면:
      1. recordstartOrMeasureOptionsdetailStructuredSerialize 알고리즘을 호출한 결과로 둡니다.
      2. entrydetailrecord현재 렘StructuredDeserialize 알고리즘을 호출한 결과로 설정합니다.
    2. 그렇지 않으면, 이를 null로 설정합니다.
  10. entry큐에 넣습니다.
  11. entryperformance entry buffer에 추가합니다.
  12. entry를 반환합니다.
3.1.3.1 PerformanceMeasureOptions 딕셔너리
detail
measure에 포함될 메타데이터.
start
시작 시간으로 사용할 타임스탬프 또는 시작 mark로 사용할 문자열.
duration
시작 시간과 종료 시간 사이의 지속 시간.
end
종료 시간으로 사용할 타임스탬프 또는 종료 mark로 사용할 문자열.

3.1.4 clearMeasures() 메서드

연결된 이름을 가진 저장된 타임스탬프를 제거합니다. 이 메서드는 다음 단계를 실행해야 MUST 합니다.

  1. measureName이 생략된 경우, PerformanceMeasure 객체를 모두 performance entry buffer에서 제거합니다.
  2. 그렇지 않으면, PerformanceMeasure 객체 중 performance entry buffer에 나열되어 있고 그 namemeasureName인 객체를 모두 제거합니다.
  3. undefined를 반환합니다.

3.2 PerformanceMark 인터페이스

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 속성은 값이 0DOMHighResTimeStamp를 반환해야 합니다.

PerformanceMark 인터페이스에는 다음 추가 속성이 포함됩니다.

detail 속성은 설정된 값을 반환해야 합니다(이는 PerformanceMarkOptions 딕셔너리에서 복사됩니다).

3.2.1 PerformanceMark 생성자

PerformanceMark 생성자는 다음 단계를 실행해야 합니다.

  1. 현재 전역 객체Window 객체이고 markNamePerformanceTiming 인터페이스의 읽기 전용 속성과 같은 이름을 사용하는 경우, throw a SyntaxError.
  2. PerformanceMark 객체 (entry)를 현재 전역 객체으로 새로 만듭니다.
  3. entryname 속성을 markName으로 설정합니다.
  4. entryentryType 속성을 DOMString "mark"로 설정합니다.
  5. entrystartTime 속성을 다음과 같이 설정합니다.
    1. markOptionsstartTime 멤버가 존재하면:
      1. markOptionsstartTime이 음수이면, TypeError를 throw합니다.
      2. 그렇지 않으면, entrystartTimemarkOptionsstartTime 값으로 설정합니다.
    2. 그렇지 않으면, 이를 Performance 객체의 now() 메서드가 반환할 값으로 설정합니다.
  6. entryduration 속성을 0으로 설정합니다.
  7. markOptionsdetail이 null이면, entrydetail을 null로 설정합니다.
  8. 그렇지 않으면:
    1. recordmarkOptionsdetailStructuredSerialize 알고리즘을 호출한 결과로 둡니다.
    2. entrydetailrecord현재 렘StructuredDeserialize 알고리즘을 호출한 결과로 설정합니다.

3.3 PerformanceMeasure 인터페이스

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 딕셔너리에서 복사됩니다).

4. 처리

참고

User Timing API를 구현하는 사용자 에이전트는 supportedEntryTypes"mark""measure"를 포함해야 합니다. 이를 통해 개발자는 User Timing 지원 여부를 감지할 수 있습니다.

4.1 marktimestamp로 변환

DOMString 또는 DOMHighResTimeStampmark가 주어졌을 때, mark를 timestamp로 변환하려면 다음 단계를 실행합니다.

  1. markDOMString이고 PerformanceTiming 인터페이스의 읽기 전용 속성과 같은 이름을 가지면, end timenamemark의 값으로 설정하여 name을 timestamp로 변환 알고리즘을 실행한 결과로 둡니다.
  2. 그렇지 않고, markDOMString이면, end timeperformance entry buffer 안의 PerformanceMark 객체 중 그 namemark인 가장 최근 항목의 startTime 속성 값으로 둡니다. 일치하는 항목을 찾을 수 없으면, throw a SyntaxError.
  3. 그렇지 않고, markDOMHighResTimeStamp이면:
    1. mark가 음수이면, TypeError를 throw합니다.
    2. 그렇지 않으면, end timemark로 둡니다.

4.2 nametimestamp로 변환

PerformanceTiming 인터페이스의 읽기 전용 속성name이 주어졌을 때, name을 timestamp로 변환하려면 다음 단계를 실행합니다.

  1. 전역 객체Window 객체가 아니면, throw a TypeError.
  2. namenavigationStart이면, 0을 반환합니다.
  3. startTimePerformanceTiming 인터페이스의 navigationStart 값으로 둡니다.
  4. endTimePerformanceTiming 인터페이스의 name 값으로 둡니다.
  5. endTime0이면, throw an InvalidAccessError.
  6. endTime에서 startTime을 뺀 결과를 반환합니다.
참고

PerformanceTiming 인터페이스는 [NAVIGATION-TIMING]에서 정의되었으며 현재는 폐기된 것으로 간주됩니다. PerformanceTiming 인터페이스의 이름 사용은 하위 호환성을 유지하기 위해 지원되지만, 앞으로 이 기능을 [NAVIGATION-TIMING-2]에서 정의된 PerformanceNavigationTiming 인터페이스의 이름(또는 다른 인터페이스)으로 확장할 계획은 없습니다.

6. 개인정보 보호와 보안

이 절은 비규범적입니다.

이 명세에서 정의하는 인터페이스는 페이지의 특정 JavaScript 활동에 관한 잠재적으로 민감한 타이밍 정보를 노출합니다. 고해상도 타이밍 정보 노출에 관한 개인정보 보호 및 보안 고려사항은 [HR-TIME-2]를 참조하십시오.

웹 플랫폼은 페이지에 포함된 모든 스크립트가 어느 출처의 스크립트인지와 관계없이 같은 페이지에 포함된 다른 모든 스크립트와 동일한 접근 권한을 가진다는 불변 조건으로 설계되었기 때문에, 이 명세에서 정의하는 인터페이스는 기록된 타이밍 정보의 기록 또는 검색에 어떠한 제한도 두지 않습니다. 즉, 페이지에 포함된 어떤 스크립트가 기록한 user timing mark 또는 measure도 출처와 관계없이 같은 페이지에서 실행 중인 다른 모든 스크립트가 읽을 수 있습니다.

A. 감사의 말

이 작업에 기여해 준 James Simonsen, Jason Weber, Nic Jansma, Philippe Le Hegaret, Karen Anderson, Steve Souders, Sigbjorn Vik, Todd Reifsteck, and Tony Gentilcore에게 감사드립니다.

B. 참고 문헌

B.1 규범 참고 문헌

[HR-TIME-2]
High Resolution Time Level 2. Ilya Grigorik. W3C. 2019년 11월 21일. W3C Recommendation. URL: https://www.w3.org/TR/hr-time-2/
[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[NAVIGATION-TIMING]
Navigation Timing. Zhiheng Wang. W3C. 2012년 12월 17일. W3C Recommendation. URL: https://www.w3.org/TR/navigation-timing/
[PERFORMANCE-TIMELINE-2]
Performance Timeline. Nicolas Pena Moreno. W3C. 2025년 5월 21일. CRD. URL: https://www.w3.org/TR/performance-timeline/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. 1997년 3월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. 2017년 5월. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/

B.2 정보 참고 문헌

[ECMA-262]
ECMAScript Language Specification. Ecma International. URL: https://tc39.es/ecma262/multipage/
[NAVIGATION-TIMING-2]
Navigation Timing Level 2. Yoav Weiss; Noam Rosenthal. W3C. 2026년 2월 25일. W3C Working Draft. URL: https://www.w3.org/TR/navigation-timing-2/
[USER-TIMING-2]
User Timing Level 2. Ilya Grigorik. W3C. 2019년 2월 26일. W3C Recommendation. URL: https://www.w3.org/TR/user-timing-2/