이 페이지에서

QML 디스크 캐시

최적의 성능을 달성하기 위해 QML 문서는 빌드 과정에서 미리 사전 컴파일되거나, 런타임에 컴파일 후 캐시됩니다. 이 페이지에서는 두 가지 전략과 캐싱 동작을 구성하는 방법을 설명합니다.

사전 컴파일

qt_add_qml_module을 사용하여 QML 모듈을 정의해야 합니다. 이렇게 하면 Qt Quick Compiler QML 및 자바스크립트 파일을 미리 처리합니다. 이를 통해 런타임 시 최적의 성능이 보장됩니다.

이 Qt Quick Compiler 각 함수와 바인딩에 대한 바이트 코드를 생성합니다. 이 바이트 코드는 QML 엔진 내의 QML 인터프리터와 JIT(Just-in-Time) 컴파일러에서 사용할 수 있습니다. 또한, Qt Quick Compiler 적합한 함수와 바인딩에 대해 네이티브 코드를 생성합니다. 네이티브 코드는 직접 실행되므로, 바이트 코드를 해석하거나 JIT(Just-in-Time) 컴파일하는 것보다 더 나은 성능을 제공합니다. 그런 다음 바이트 코드와 네이티브 코드 모두 애플리케이션 바이너리로 컴파일됩니다.

사전 컴파일의 장점 중 하나는 QML 문서의 구문 오류가 파일이 로드되는 런타임이 아닌 애플리케이션 컴파일 시점에 감지된다는 점입니다.

CMake 사용 시

CMake를 qt_add_qml_module과 함께 사용할 경우, QML 파일은 자동으로 사전 컴파일됩니다. 가능한 경우 리소스 파일 시스템에서 QML 문서를 불러와야 합니다. 이렇게 하면 QML 엔진이 사전 컴파일된 코드를 찾을 수 있습니다.

qmake 사용 시

qmake를 사용할 때는 프로젝트 파일에서 ` CONFIG += qtquickcompiler `를 지정하여 사전 컴파일을 활성화할 수 있습니다. Qt Creator 에는 이 지시어를 qmake 명령줄에 전달할 수 있는 설정이 있습니다. 기본적으로 릴리스 및 프로파일 빌드에서 이 기능이 활성화되어 있습니다.

qmake를 사용할 때는 프로젝트를 특정 방식으로 구성해야 합니다:

  • 모든 QML 문서(자바스크립트 파일 포함)는 Qt의 리소스 시스템을 통해 리소스로 포함되어야 합니다.
  • 애플리케이션은 qrc:/// URL 스키마를 통해 QML 문서를 불러와야 합니다.

qmake는 CMake만큼 많은 정보를 전달할 수 없다는 점에 유의하십시오. Qt Quick Compiler 만큼 많은 정보를 전달할 수 없다는 점에 유의하십시오. 따라서 컴파일 결과물에는 네이티브 코드가 더 적게 포함됩니다.

런타임 디스크 캐싱

실행 시점에 미리 컴파일된 코드가 없거나 코드를 사용할 수 없는 경우, QML 엔진은 QML 문서를 그 자리에서 바이트 코드 형식으로 컴파일합니다. QML 엔진은 문서가 로드될 때마다 동일한 문서를 다시 컴파일하는 대신, 컴파일된 바이트 코드를 캐시에 저장합니다. 캐싱 과정은 자동으로 이루어집니다. 변경된 QML 문서를 로드할 때마다 캐시가 자동으로 재 생성됩니다.

캐시 파일 형식 및 위치

캐시 파일은 다음 확장자를 사용합니다:

  • .qmlc 컴파일된 QML 문서의 경우
  • .jsc 임포트된 JavaScript 파일의 경우
  • .mjsc ECMAScript 모듈의 경우

캐시 파일은 QStandardPaths::CacheLocation 에 명시된 대로 시스템 캐시 디렉터리의 ‘ qmlcache ’라는 하위 디렉터리에 위치합니다.

메모리 효율성

캐시 파일은 POSIX 호환 운영 체제에서는 mmap() 시스템 호출을 통해, Windows에서는 CreateFileMapping() 를 통해 로드됩니다. 이러한 메모리 매핑 방식은 메모리를 상당히 절약해 줍니다. 또한, 여러 애플리케이션이 동일한 QML 문서를 사용할 경우, 코드에 필요한 메모리가 애플리케이션 프로세스 간에 공유되어 메모리 오버헤드를 더욱 줄여줍니다.

캐시 유효성 검사

캐시 파일과 AOT(Ahead-of-Time) 컴파일된 코드는 다음 조건이 모두 충족될 때만 로드됩니다:

  • Qt 버전이 변경되지 않았을 경우
  • 원본 파일의 소스 코드가 변경되지 않았을 것
  • QML 디버거가 실행 중이 아니다
  • AOT 코드의 유효성 검사가 성공해야 함

QML_FORCE_DISK_CACHE (아래 참조)가 QML 디버거 조건을 무시할 수 있다는 점에 유의하십시오. 다른 환경 변수들은 이러한 유효성 검사 조건에 영향을 미치지 않습니다.

사전 생성된 네이티브 코드의 유효성 검사

에 의해 생성된 네이티브 코드에는 Qt Quick Compiler 내장된 가정들이 있습니다. 코드가 실행되는 환경이 컴파일 당시의 환경과 다르면, 해당 코드를 사용하는 것이 안전하지 않을 수 있습니다. 따라서 네이티브 코드는 함께 저장된 메타데이터를 사용하여 런타임에 유효성 검증을 거칩니다. 이 유효성 검증을 통과하면 코드는 정상적으로 실행됩니다. 검증이 실패하면, 실행은 아무런 오류 메시지 없이 바이트코드 해석으로 대체됩니다. 이 검증은 파일당 한 번, 즉 코드가 처음 로드될 때 수행되며, 해당 QML 파일에 포함된 모든 함수와 바인딩을 전체적으로 승인하거나 거부합니다.

AOT 코드의 유효성 검증을 사용자 정의할 수 있습니다:

  • 런타임 시 유효성 검사를 비활성화하려면 ` QV4_SKIP_AOT_VALIDATION ` 환경 변수를 설정하십시오. 이렇게 하면 유효성 검사 수행에 따른 사소한 오버헤드를 피할 수 있습니다.
    QV4_SKIP_AOT_VALIDATION=1 ./myQmlApp
  • 런타임에 유효성 검사가 성공하도록 하려면 QV4_FAIL_ON_INVALID_AOT 환경 변수를 설정하십시오. 유효성 검사가 실패하면 프로그램이 종료됩니다. 이를 통해 예를 들어, 컴파일된 함수가 실제로 네이티브 코드로 실행되는지 확인할 수 있습니다.
    QV4_FAIL_ON_INVALID_AOT=1 ./myQmlApp
  • 이 기능을 완전히 비활성화하고 Qt Quick Compiler 메타데이터 및 유효성 검사 로직 생성을 방지하려면, qt_add_qml_module에 NO_GENERATE_AOT_VALIDATION 을 전달하십시오.
    qt_add_qml_module(... NO_GENERATE_AOT_VALIDATION)

구성

QML_DISK_CACHE 환경 변수를 사용하여 캐싱 동작을 세부적으로 조정할 수 있으며, 이 변수는 쉼표로 구분된 옵션 목록을 받습니다. 예를 들어:

QML_DISK_CACHE=aot,qmlc-read

사용 가능한 옵션은 다음과 같습니다:

옵션설명
aot-native사전 컴파일된 컴파일 유닛을 불러오고, 해당 유닛에서 발견된 모든 네이티브 코드의 실행을 허용합니다.
aot-bytecode사전 컴파일된 컴파일 유닛을 로드하고, 해당 유닛에서 발견된 바이트코드의 해석 및 JIT(Just-In-Time) 컴파일을 허용합니다.
aotaot-native,aot-bytecode 의 약어입니다.
qmlc-read호스트 파일 시스템에서 QML 및 JavaScript 파일에 대한 캐시된 컴파일 유닛을 모두 불러오고, 그 안에서 발견된 바이트 코드의 해석 및 JIT(Just-In-Time) 컴파일을 허용합니다.
qmlc-writeQML 또는 JavaScript 파일을 즉석에서 컴파일할 때, 컴파일 후 캐시 파일을 생성합니다. 동일한 문서가 다시 요청될 때 이 캐시 파일을 불러올 수 있습니다.
qmlcqmlc-read,qmlc-write 의 약어입니다.

또한 다음 환경 변수를 사용할 수 있습니다:

환경 변수설명
QML_DISABLE_DISK_CACHE디스크 캐시를 비활성화하고 모든 QML 및 JavaScript 파일에 대해 소스 코드로부터의 재컴파일을 강제합니다. ` QML_DISABLE_DISK_CACHE `는 ` QML_DISK_CACHE`를 재정의합니다.
QML_FORCE_DISK_CACHEQML 디버깅 시에도 디스크 캐시를 활성화합니다. 이 방식에서는 JavaScript 디버거를 사용할 수 없습니다. 예를 들어, 중단점에서 실행이 중지되지 않을 수 있습니다. 하지만 QML 인스펙터를 사용하여 객체 계층 구조를 탐색하는 것은 여전히 가능합니다. ` QML_FORCE_DISK_CACHE `는 ` QML_DISABLE_DISK_CACHE ` 및 ` QML_DISK_CACHE`를 재정의합니다.
QML_DISK_CACHE_PATH기본 위치 대신 캐시 파일을 저장할 사용자 지정 위치를 지정합니다.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.