この記事では、Clang の PGO(Profile-Guided Optimization)ビルドについて説明します。
Qt Creator では、Windows x64 向けに clangd(以前は libclang.dll)の PGO ビルドをかなり前から提供してきました。MSVC コンパイラで生成した PGO バイナリの方が低速だったため、MinGW GCC による clangd ビルドを採用していました。
Clang 22 への更新に伴い、MinGW GNU コンパイラ(13.1.0)では PGO ビルドに問題が生じたため、別のアプローチを取る必要が生まれました。
その解決策が、Clang 自体のマルチステージ PGO ビルドです。
これはもはや Windows x64 限定ではなく、全プラットフォームで利用可能になりました!
llvm.org のドキュメントには次のように記されています:
PGO(Profile-Guided Optimization)を使用すると、コンパイラが実際の実行パターンに基づいてコードをより適切に最適化できます。Clang と LLVM にこれを適用することで、全体的なコンパイル時間を 20% 短縮できるとのユーザー報告があります。
テスト環境
Qt Creator 19.0.2(clangd 21.1.2)と Qt Creator 20.0.0 beta1(clangd 22.1.2)でテストを実施しました。
Qt Creator 上で Qt Creator 19.0 ブランチのソースコードを開き、texteditor.cpp(約 11,000 行)を開いてファイルの末尾までスクロールしました。
次に、ロギングカテゴリ qtc.languageserverprotocol.timing の Debug 値を有効にして、以下の 2 つの値を収集しました:
16:45:10.429 qtc.languageserverprotocol.timing: received server reply to "textDocument/documentHighlight" after 1912 ms
16:45:10.443 qtc.languageserverprotocol.timing: received server reply to "textDocument/semanticTokens/full" after 639 ms
テストに使用したハードウェアは以下の通りです:
- Apple MacBook Pro(Apple M3 Pro)、macOS 26.5
- Bosgame M5(AMD RYZEN AI MAX+ 395、Radeon 8060S 搭載)、Windows 11 x64 25H2 および WSL2 上の Ubuntu 24.04
- Lenovo ThinkPad T14s Gen 6(Snapdragon(R) X Elite - X1E78100)、Windows 11 arm64 25H2 および WSL2 上の Ubuntu 24.04
clangdの速度向上
各マシン・OS で 5 回ずつテストを実施しました。
| OS |
Qt Creator version |
clangd version |
Document Highlight |
高速化率 |
Semantic Tokens |
高速化率 |
| macOS (MacBook) |
19.0.2 |
21.1.2 |
1914.8 ms |
- |
643.4 ms |
- |
| macOS (MacBook) |
20.0.0 beta1 |
22.1.2 |
1428.6 ms |
25.4% |
515.8 ms |
19.8% |
| Windows x64 (Bosgame) |
19.0.2 |
21.1.2 |
3233.4 ms |
- |
953.4 ms |
- |
| Windows x64 (Bosgame) |
20.0.0 beta1 |
22.1.2 |
2837.8 ms |
12.2% |
807 ms |
15.4% |
| Linux x64 (Bosgame) |
19.0.2 |
21.1.2 |
3282.8 ms |
- |
982.4 ms |
- |
| Linux x64 (Bosgame) |
20.0.0 beta1 |
22.1.2 |
2581.2 ms |
21.4% |
784.4 ms |
20.2% |
| Windows arm64 (ThinkPad) |
19.0.2 |
21.1.2 |
3865 ms |
- |
1096.6 ms |
- |
| Windows arm64 (ThinkPad) |
20.0.0 beta1 |
22.1.2 |
2553.8 ms |
33.9% |
751 ms |
31.5% |
| Linux arm64 (ThinkPad) |
19.0.2 |
21.1.2 |
3020.6 ms |
- |
938.8 ms |
- |
| Linux arm64 (ThinkPad) |
20.0.0 beta1 |
22.1.2 |
2050.4 ms |
32.1% |
709.2 ms |
24.5% |
clangd.Windows x64 (Bosgame) の改善が小さいのは、Qt Creator 19 がすでに MinGW GCC による PGO 最適化済み clangd を使用していたためです。
ビルド時間
PGO 最適化済みコンパイラが用意できたので、リンカとデバッガについても PGO 最適化ビルドを試してみることにしました。
各プラットフォームで Qt Creator 19.0 を 3 回ずつビルドし、ネイティブコンパイラと PGO Clang コンパイラ・リンカを比較しました。
| OS |
コンパイラ |
ビルド時間 (mm:ss) |
高速化率 |
| macOS (MacBook) |
Apple Clang 21.0.0 |
06:17 |
- |
| macOS (MacBook) |
Clang 22.1.2 |
05:45 |
8.5% |
| Windows x64 (Bosgame) |
MSVC 2026 |
06:54 |
- |
| Windows x64 (Bosgame) |
Clang-cl 22.1.2 |
04:40 |
32.3% |
| Linux x64 (Bosgame) |
GCC 13.3.0 |
06:30 |
- |
| Linux x64 (Bosgame) |
Clang 22.1.2 |
04:15 |
34.6% |
| Windows arm64 (ThinkPad) |
MSVC 2026 |
18:35 |
- |
| Windows arm64 (ThinkPad) |
Clang-cl 22.1.2 |
10:30 |
43.5% |
| Linux arm64 (ThinkPad) |
GCC 13.3.0 |
16:29 |
- |
| Linux arm64 (ThinkPad) |
Clang 22.1.2 |
10:32 |
36.1% |
| Linux arm64 (ThinkPad)¹ |
GCC 13.3.0 |
15:45 |
- |
| Linux arm64 (ThinkPad)¹ |
Clang 22.1.2 |
08:31 |
45.9% |
¹ 下記の補足を参照してください。
非常に大きな改善です!macOS での改善が小さいのは、Apple が Clang の PGO ビルドを実施しているものの、トレーニングに Qt コードを使用していないためと考えられます。
補足
Windows では、clang-cl でコンパイルするために以下の CMakeUserPresets.json を使用しました。正しい構成を確保するため、Qt Creator で MSVC 2026 環境を手動で設定し、CMake プリセットキットが認識できるようにしました。
{
"version": 4,
"cmakeMinimumRequired": {
"major": 3,
"minor": 23,
"patch": 0
},
"configurePresets": [
{
"name": "MSVC-Release",
"displayName": "MSVC Release Build",
"binaryDir": "${sourceDir}/build/${presetName}",
"generator": "Ninja",
"architecture" : {
"value": "x64"
},
"cacheVariables": {
"CMAKE_C_COMPILER": "c:/llvm/msvc/bin/clang-cl.exe",
"CMAKE_CXX_COMPILER": "c:/llvm/msvc/bin/clang-cl.exe",
"CMAKE_LINKER": "c:/llvm/msvc/bin/lld-link.exe",
"CMAKE_CXX_FLAGS_INIT": "-Wno-clang-cl-pch",
"CMAKE_PREFIX_PATH": "c:/Qt/6.11.1/msvc2022_64;c:/llvm/msvc",
"CMAKE_BUILD_TYPE": "Release",
"WITH_QMLDESIGNER": false,
"WITH_CCACHE_SUPPORT": false
}
}
]
}
macOS では、Clang コンパイラが macwebkithelpviewer.mm(Objective-C++ ファイル)でエラーが発生したため、ビルドシステムから除外することにしました:
--- src/plugins/help/CMakeLists.txt
+++ src/plugins/help/CMakeLists.txt
@@ -34,15 +34,15 @@ extend_qtc_plugin(Help
DEFINES QTC_DEFAULT_HELPVIEWER_BACKEND="${HELPVIEWER_DEFAULT_BACKEND}"
)
-extend_qtc_plugin(Help
- CONDITION FWWebKit AND FWAppKit
- FEATURE_INFO "Native WebKit help viewer"
- DEPENDS ${FWWebKit} ${FWAppKit}
- DEFINES QTC_MAC_NATIVE_HELPVIEWER
- SOURCES
- macwebkithelpviewer.h
- macwebkithelpviewer.mm
-)
+# extend_qtc_plugin(Help
+# CONDITION FWWebKit AND FWAppKit
+# FEATURE_INFO "Native WebKit help viewer"
+# DEPENDS ${FWWebKit} ${FWAppKit}
+# DEFINES QTC_MAC_NATIVE_HELPVIEWER
+# SOURCES
+# macwebkithelpviewer.h
+# macwebkithelpviewer.mm
+# )
option(BUILD_HELPVIEWERBACKEND_QTWEBENGINE "Build QtWebEngine based help viewer backend." YES)
find_package(Qt6 COMPONENTS WebEngineWidgets QUIET)
ただし、これがビルドの 8.5% 高速化の原因ではないと思います!😅
ThinkPad では WSL2 のメモリを 16GB から 24GB に増やしましたが、プリコンパイル済みヘッダーに関するコンパイルエラーが発生しました。エラーが出てもビルドを継続できるよう、ビルドステップに -k 0 引数を追加しました。
エラーの内容:
src/tools/qtc-askpass/qtc-askpass_autogen/mocs_compilation.cpp
error: is pie differs in precompiled file '/home/cristian/Projects/QtCreator/build/GCC-Release/src/libs/3rdparty/syntax-highlighting/CMakeFiles/QtCreatorPchGui.dir/cmake_pch.hxx.pch' vs. current file
CMAKE_POSITION_INDEPENDENT_CODE:ON を設定してすべての CMake ターゲットにこのプロパティを付与しようとしましたが、解決しませんでした。
同じ Ubuntu バージョン・同じコードチェックアウト・同じ Clang コンパイラを使用した Linux x64 では問題なく動作したことから、Linux arm64 における Clang のバグである可能性があります。
CMake にはこのケースに関するオープンな Issue として PCH: PIC/PIE mismatch when using REUSE_FROM があります。
Linux arm64 でのビルド速度は報告した 36.1% よりもわずかに遅く、Ninja の最終進捗は以下の通りでした:
[3630/3642 5.7/sec] Elapsed time: 10:33
更新 CMake のバグレポートを詳しく確認したところ、CMakeUserPresets.json に "CMAKE_CXX_FLAGS_INIT": "-fPIC" を追加するだけで解決することがわかりました。
この修正により、Linux arm64 上での Qt Creator 19.0 のコンパイルも問題なく完了しました!🎉
コンパイル時間は 08:33、08:17、08:42 で、平均は 08:31 でした。ネイティブ GCC 13.3.0 では 16:07、16:20、14:47 で、平均は 15:45 でした。
これは 45.9% の速度向上です!
Clang・GCC 両方でのパフォーマンス向上は、ラップトップのサーマル状態が良好だったためと考えられます。前日はサーマルスロットリングが発生していた可能性があります。
生データは Bosgame、MacBook Pro、ThinkPad でご確認いただけます。
その他のメリット
ビルドは高速化されましたが、生成されるコードについては多くを語ることができません。上記の clangd テスト結果が、Clang ビルドが GCC および MSVC ビルドより優れていることを示す数少ない根拠です。
macOS では C++ 20 Modules を使用できます。cppreferences.com では AppleClang のサポート状況は「Partial」とされており、arewemodulesyet.org では ❌ となっています。
Windows では、Clang が問題なく処理できる長いソースファイルパスを使用できます。MSVC ではこれに対応していません。
入手方法
Clang ビルド(7z アーカイブ)は download.qt.io からダウンロードできます。
Qt Creator には clangd が同梱されており、Windows ではさらに lldb デバッガも含まれています。
Qt Creator にコンパイラとリンカもデフォルトで同梱すべきでしょうか?ぜひコメント欄でご意見をお聞かせください!