CPU 성능 API

비공식 제안 초안,

이 문서에 대한 자세한 정보
이 버전:
https://wicg.github.io/cpu-performance/
이슈 추적:
GitHub
편집자:
(Google)

초록

이 문서는 사용자 기기가 얼마나 강력한지에 관한 일부 정보를 노출하는 간단한 웹 API를 정의한다. 이는 이 정적 정보를 사용하여 개선된 사용자 경험을 제공할 웹 애플리케이션을 대상으로 하며, 사용자 기기의 CPU 압력/사용률에 관한 동적 정보를 제공하고 애플리케이션이 CPU 압력 변화에 대응할 수 있게 하는 Compute Pressure API와 함께 사용될 수도 있다.

이 문서의 상태

1. 소개

이 절은 비규범적이다.

사용자 기기가 얼마나 강력한지에 따라 웹 콘텐츠를 조정하려는 개발자의 관심은 늘 존재해 왔다. 예를 들어, 화상 회의 애플리케이션이나 비디오 게임은 고급 비디오 효과를 렌더링할 수 있는지 결정하기 위해 이 정보를 사용할 수 있으며, 모든 유형의 애플리케이션은 AI 작업을 로컬에서 실행할지 아니면 서버에 위임할지 등을 결정하는 데 사용할 수 있다.

특히, 웹 애플리케이션은 성능 정보를 다음과 같은 용도로 사용하려 할 수 있다.

  1. 비필수 작업과 요청을 제어한다. 예를 들어, 서드 파티 스크립트를 허용하거나 차단하고, 무거운 라이브러리를 사용하거나 피한다.

  2. 웹 콘텐츠의 복잡도를 조정한다. 예를 들어, 이미지와 비디오의 해상도 및 형식, 데이터 업로드 시 압축 수준, 애니메이션과 같이 계산량이 많은 작업의 활성화 또는 비활성화, 리소스 관리 개선(지연 로딩, 프리페칭, 프리렌더링) 등을 조정한다.

  3. 실제 사용자 모니터링을 개선한다. 예를 들어, 사용자가 더 빠른 기기 또는 더 느린 기기를 사용하는지 더 잘 이해하고, 개발 노력을 더 적절하게 집중한다.

  4. 클라이언트 측과 서버 측 중 어디에서 계산을 실행할지 결정한다. 예를 들어, 서버 측 렌더링을 사용하거나, AI 애플리케이션과 LLM을 클라이언트 측에서 실행한다.

  5. 사용자 기기에 더 적합한 광고를 선택한다.

2. CPU 성능

현대의 컴퓨팅 기기는 그 성격과 기능이 서로 다른 여러 이기종 처리 장치를 통합하는 경우가 많다. 중앙 처리 장치(CPU)는 모든 컴퓨팅 기기의 핵심 구성 요소이다. 현대의 컴퓨팅 기기는 여러 개의 집적 회로(멀티코어 프로세서)를 포함하며, 각 회로에는 독립적인 CPU처럼 동작하는 여러 개의 물리 코어가 포함된다. 또한 동시 멀티스레딩(또는 하이퍼스레딩) 기술은 물리 코어가 여러 명령어 스레드를 처리할 수 있게 하여, 운영 체제에는 여러 개의 별도 논리 코어처럼 보이게 한다.

CPU 외에도 현대의 컴퓨터는 다음과 같은 다른 유형의 처리 장치를 포함할 수 있다.

이 명세는 현재 중앙 처리 장치만을 다루며, 그 성능의 척도를 웹 애플리케이션에 노출하는 것을 목표로 한다. 이 명세의 향후 버전은 다른 유형의 처리 장치도 다룰 수 있다.

이 문서에서는 컴퓨팅 기기에 포함된 중앙 처리 장치들의 집합을 가리키기 위해 CPU라는 용어를 사용한다. 이 문서에서는 운영 체제가 보고하는 대로 명령어 스레드를 실행할 수 있는 CPU 부분, 즉 물리 또는 논리 부분을 가리키기 위해 코어라는 용어를 사용한다. 이 문서에서는 초당 사이클 수(Hz)로 표현되고 물리 코어가 명령어를 얼마나 빠르게 실행할 수 있는지를 결정하는 CPU의 클록 속도를 가리키기 위해 주파수라는 용어를 사용한다.

이 문서에서는 웹 애플리케이션의 관점에서 CPU가 얼마나 빠르다고 인식되는지를 가리키기 위해 성능이라는 용어를 사용한다. 빠른 CPU는 작업을 더 빨리 처리하며, 예를 들어 애플리케이션 로딩을 더 빠르게 하고, 멀티태스킹을 더 원활하게 하며, 게임을 더 부드럽게 실행하는 등의 결과를 낳는다.

3. 성능 계층

CPU Performance API는 사용자 기기를 그 CPU 성능에 따라 소수의 성능 계층으로 분류한다. 각 성능 계층은 작은 양의 정수로 표현된다. 값이 높을수록 더 높은 성능 계층, 즉 더 강력한 사용자 기기에 해당한다.

서로 다른 네 개의 성능 계층이 있으며, 1–4로 번호가 매겨진다. 이 API를 사용하는 애플리케이션은 시간이 지남에 따라 기기가 개선되면서 향후 추가될 가능성이 있는 추가 계층(5 이상 번호)를 처리해야 한다.

특수 값 0(영)은 알 수 없는 성능 계층에 해당하며, API 구현이 사용자 기기를 분류할 수 없는 경우 반환된다.

3.1. 성능 계층 값 계산

사용자 기기를 성능 계층으로 분류하는 방식은 구현 정의이며, 웹 애플리케이션은 각자의 특정 요구에 따라 이를 해석해야 한다. 그러나 이 API의 구현은 다음 규칙을 따라야 한다.

  1. 일관성: 기기를 성능 계층에 매핑하는 방식은 특정 벤치마크로 측정할 수 있는 CPU 성능을 반영해야 하며, 이상적으로는 브라우저가 제공하는 프로그래밍 도구 (JavaScript, WebAssembly 등)를 사용하고 이상적인 조건에서 측정해야 한다. 더 강력한 기기가 덜 강력한 기기보다 낮은 성능 계층으로 분류되어서는 안 된다.

  2. 재현성: 구현은 동일한 사용자 기기에 대해 항상 동일한 성능 계층을 보고해야 한다. 특히:

    • 보고되는 성능 계층은 사용자 기기의 현재 부하나 사용률에 의존해서는 안 되며;

    • 구현은 계층을 재정의해서는 안 된다. 즉, 기술이 발전하면서 더 최신의 고성능 기기를 수용하기 위해 계층 4 기기를 계층 3으로 재분류해서는 안 된다. 대신 필요가 생기면 이러한 최신 기기를 위해 새로운 계층 5가 이 명세에 추가되고, 이후 계층 6 등도 추가될 것이다.

    참고: 이 규칙의 의도는 이 API 구현에서 분류 오류를 수정할 수 없게 만드는 것이 아니다. 그러한 오류는 필연적으로 수정되어야 한다. 오히려 이 규칙의 의도는 새로운 기술이 등장할 때 CPU 모델을 재분류하지 않도록 하여, 오래된 애플리케이션을 실행하는 오래된 기기의 동작을 깨뜨리지 않도록 하는 데 있다.

  3. 사용자 개인정보 보호: 사용자 핑거프린팅을 피하기 위해 구현은 각 성능 계층에 상당히 많은 수의 사용자 기기를 분류해야 한다 (§ 5 보안 및 개인정보 보호 고려 사항도 참조). 특히, 어떤 CPU 모델 데이터베이스를 기반으로 하는 구현은 데이터베이스에 포함되어 있지 않은 새로운 사용자 기기에 대해 특수 값 0을 반환해서는 안 된다. 이 특수 값은 구현이 운영 체제에서 CPU에 대한 정보를 얻을 수 없는 경우에만 반환되어야 한다.

구현은 다음 특성을 기반으로 주어진 사용자 기기의 성능 계층 값을 계산할 수 있다(필수는 아님).

4. JavaScript API

[
    SecureContext,
    Exposed=Window
] partial interface Navigator {
    readonly attribute unsigned short cpuPerformance;
};
cpuPerformance getter 단계는 다음과 같다.
  1. tier를 기기의 CPU에 대한 성능 계층을 나타내는 unsigned short로 둔다. 이 값은 § 3.1 성능 계층 값 계산에 설명된 권고 사항과 제약을 고려하여 구현 정의 방식으로 생성된다.

  2. Assert: 0 ≤ tier ≤ 4.

  3. tier를 반환한다.

5. 보안 및 개인정보 보호 고려 사항

CPU Performance API는 HTTPS 보안 컨텍스트에서만 사용할 수 있다.

핑거프린팅 위험을 줄이기 위해 CPU Performance API는 CPU 특성을 직접 드러내지 않는다. 보고되는 값은 CPU에 해당하는 성능 계층을 나타내는 작은 정수이다. 각 가능한 값(계층)에 대해, 구현은 특정 시점에 인터넷에 존재하는 상당히 많은 수의 컴퓨팅 기기가, 절대적인 수와 서로 다른 CPU 모델 수 양쪽 모두에서, 이 성능 계층을 가진 것으로 분류되도록 보장해야 한다. 특히 이 명세의 의도는 각 성능 계층이 특정 시점에 존재하는 CPU 모델의 10% 이상과 기존 사용자 기기의 10% 이상을 포함하도록 하는 데 있다.

TAG 보안/개인정보 보호 설문지도 참조한다.

6. 예제

이 절은 비규범적이다.

화상 회의 애플리케이션은 네 개의 성능 계층을 다음과 같이 해석할 수 있다. 이 해석은 애플리케이션별로 다르며, 그 경우에도 애플리케이션 자체가 업데이트되고 하드웨어 요구 사항이 변경되면 향후 갱신해야 할 수 있다.

이러한 애플리케이션은 사용자 기기의 성능 계층에서 가장 잘 지원되는 여러 기능을 미리 선택하기 위해 navigator.cpuPerformance 값을 사용할 수 있다.

function getPresetFeatures() {
  switch (navigator.cpuPerformance) {
    case 1:
      return {
        videoQuality: "QVGA",
        frameRate: 15,
        effects: [],
      };
    case 2:
      return {
        videoQuality: "VGA",
        frameRate: 15,
        effects: ['voice-detection', 'animated-reactions'],
      };
    case 3:
      return {
        videoQuality: "720p",
        frameRate: 30,
        effects: ['voice-detection', 'animated-reactions',
                  'noise-reduction'],
      };
    case 4:
    case 0:    // 알 수 없는 기기에 대해 고성능 설정을 가정
    default:   // 그리고 4보다 높은 성능 계층에도 적용.
      return {
        videoQuality: "1080p",
        frameRate: 30,
        effects: ['voice-detection', 'animated-reactions',
                  'noise-reduction', 'virtual-background'],
      };
  }
}

7. 감사의 말

소중한 피드백과 조언을 주신 다음 분들께 깊이 감사드린다: Dominic Farolino, Deepti Gandluri, Reilly Grant, Tomas Gunnarsson, Markus Handell, Michael Lippautz, Thomas Nattestad, Nicola Tommasi, Guido Urdaneta, Måns Vestin, and Chen Xing.

W3C Web Performance Working Group(WebPerf), 특히 Yoav Weiss에게 감사드린다.

적합성

문서 규칙

적합성 요구 사항은 설명적 주장과 RFC 2119 용어의 조합으로 표현된다. 이 문서의 규범적 부분에서 사용하는 핵심 단어 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL”은 RFC 2119에 설명된 대로 해석해야 한다. 그러나 가독성을 위해 이 명세에서는 이러한 단어가 모두 대문자로 표시되지는 않는다.

명시적으로 비규범적이라고 표시된 절, 예제, 참고를 제외한 이 명세의 모든 텍스트는 규범적이다. [RFC2119]

이 명세의 예제는 “예를 들어”라는 말로 소개되거나 규범적 텍스트와 분리되어 class="example"으로 표시된다. 다음과 같다.

이는 정보 제공용 예제의 예이다.

정보 제공용 참고는 “참고”라는 단어로 시작하며, 규범적 텍스트와 분리되어 class="note"로 표시된다. 다음과 같다.

참고, 이는 정보 제공용 참고이다.

테스트

이 명세의 콘텐츠와 관련된 테스트는 이 블록과 같은 “테스트” 블록에 문서화될 수 있다. 이러한 블록은 모두 비규범적이다.


색인

이 명세에서 정의한 용어

참조로 정의된 용어

참고문헌

규범적 참고문헌

[HTML]
Anne van Kesteren; et al. HTML 표준. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 표준. Living Standard. URL: https://infra.spec.whatwg.org/
[RFC2119]
S. Bradner. RFC에서 요구 수준을 나타내기 위해 사용하는 핵심 단어. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 표준. Living Standard. URL: https://webidl.spec.whatwg.org/

IDL 색인

[
    SecureContext,
    Exposed=Window
] partial interface Navigator {
    readonly attribute unsigned short cpuPerformance;
};