资讯动态

WinUI 性能测试实战:基于 perf/ 基础设施的 CPU 与内存精确测量指南

发布时间:2026/9/17 11:53:17 来源:尧图企业网站定制
WinUI 性能测试实战基于 perf/ 基础设施的 CPU 与内存精确测量指南【免费下载链接】microsoft-ui-xamlWinUI: a modern UI framework with a rich set of controls and styles to build dynamic and high-performing Windows applications.项目地址: https://gitcode.com/GitHub_Trending/mi/microsoft-ui-xaml本文基于 Perf How-To 编写系统讲解 WinUImicrosoft-ui-xaml仓库自带性能测试框架的完整使用方法如何理解 CI 流水线自动性能监控的产出报告如何在 Azure DevOps 上发起自助式的基线对比实验如何在本地开发机上手动对任意可执行程序UWP、Desktop、Win32、XAML 编译器进行 CPU 与引用集Reference Set测量以及一台 Azure 自托管物理性能机的搭建步骤。读完本文你可以独立完成一次基线 vs 试验版本的性能对比读懂cumulative.csv等结果文件并定位测量环境中的噪声来源。一、性能框架能做什么WinUI 仓库在perf/目录下构建了一套完整的性能测量基础设施支持精确测量 CPU 用量与引用集内存用量。它支持三类使用场景自动监控 WinUI 框架性能UWP 与 Desktop 应用——CI 流水线上的常态化监控在 Azure DevOps 上发起自助式的 Dev 性能测试——验证某个变更的性能影响在 Dev 机器上手动测试任意可执行程序例如 UWP、Desktop、Win32、XAML 编译器——本地深度调查。从源码结构看这套基础设施由几个部分协作完成perf/profiles/定义配置文件、测量档位profiles、场景scenarios、WPR 采集配置与数据处理流水线是整个框架的配置中枢perf/scripts/提供run-set、provision、process等脚本包装底层工具调用perf/scenarios/用于性能测量与 PGO 训练的场景应用源码perf/vis/Python 编写的报告生成工具perf/pgo/、perf/BaselineApp/PGOProfile-Guided Optimization训练相关设施。底层数据采集依赖 ETWEvent Tracing for Windows脚本以管理员身份启动ScenarioRunner.exe见 run-set.ps1 中的#Requires -RunAsAdministrator与Run-Tool $infraPath\ScenarioRunner.exe $toolArgs由XAML.wprp定义采集哪些内核与用户态事件。二、自动监控CI 流水线上的常态化性能测试在main分支上每次场景应用构建完成后都会触发一次自动性能测试运行。要点测试在WinUI-PerfTest流水线中运行全程约45 分钟完成后数据保存在两处perf 分析网络共享目录——存放全部 trace、处理后的数据与报告该次运行的流水线制品pipeline artifacts——存放本次运行的 trace 与累计结果。报告组件会生成图表与表格。查找有意义的变化时应优先查看以下几类报告文件报告文件内容*_report-top-regressions-improvements-delta-n.html基线到试验版本之间最大绝对值的变化*_report-top-historical-regressions-improvements-delta-n.html相邻版本之间最大相对值的变化*_report-all-changes-delta-n.html所有被测量量及其从基线到试验版本的绝对变化文件名中的-delta-n后缀指明使用的基线基线由最新版本往前回退 n 次latest - n shifts计算得出。排查建议如果在*_report-top-regressions-improvements-delta-n.html中发现异常项下一步应查看对应的历史趋势图判断它是在正常测量方差之内还是值得深入调查的报告——点击场景名链接即可跳转到该场景的历史曲线。适用前提以当前文档为准目前仅测试 amd64fre 构建操作系统版本为 20H2。三、自助式 Dev 性能测试Azure DevOps如果只想验证自己变更的性能影响而不想在 Dev 机上搭建整套环境可以在 Azure DevOps 上发起自运行测试会在同样的受控环境中执行因此不同运行之间的比较是有意义的。操作步骤确定基线选用一个已存在的构建CI 或 Nightly 流水线或新触发一次。制品可用后从运行 URL 中复制Build Id打开 Azure DevOps 中的WinUI-PerfTest流水线点击Run pipeline并设置以下变量userBuildIdConsumed上一步复制的 Build IduserBuildPipelineId提供场景应用构建产物的流水线定义 id取值流水线IDCI38157Nightly51598userExperimentName本次测试的简短名称只能使用合法文件名字符不要包含空格userPerfProfiles要测量的内容。所有可用 profile 定义在 perf/profiles/profiles.json多个 profile 可用#拼接例如cpu#refsetProfile说明cpuCPU 测量迭代次数越多结果越精确越适合版本间相对比较refsetReference Set引用集/内存测量cpu-stacks带调用栈信息的 CPU 测量运行次数较少用于深入调查refset-stacks带调用栈信息的 Reference Set 测量用于深入调查userPerfTestSet要执行的场景集合。其值会与所有场景的Tags属性做匹配计算好的起点是xamlperf。所有可用场景定义在 perf/profiles/scenarios.json点击Run应少于 45 分钟完成对试验版本重复步骤 1–4使用新的 Build Id其余字段保持完全一致。结果位于 perf 分析网络共享目录下的experiments\你的域账号\userExperimentName或 perf 运行的制品中见上一节。从 profiles.json 看各 profile 的实测差异perf/profiles/profiles.json 中每个 profile 由Name、Tags、ScenarioLaunchCount与WPROptions组成。文档中列出的四个 profile 在文件中的实际配置印证了它们的定位cpuScenarioLaunchCount为31WPR 采集XAML.wprp!XAML_CPUFilemode: true——多轮迭代正是相对比较更精确的来源refsetScenarioLaunchCount为2采集XAML.wprp!XAML_Memory——引用集只需较少的样本即可收敛cpu-stacksScenarioLaunchCount为11采集更宽泛的GeneralProfile、CPU、DiskIO、XAMLActivity便于在 WPAWindows Performance Analyzer中分析refset-stacks采集ReferenceSet与XAMLActivity。此外文件中还有文档未列出的辅助 profilerefset-avg11 次的引用集平均、refset-heap-stacks含Heap事件、标记IsHeapTrace的堆分配跟踪与cpu-test3 次启动的快速自测。所有 profile 均通过PipelinePropertyFilesPaths指向 XAML.pipeline.props.json 声明数据处理流水线见第六节。从 scenarios.json 看场景选择perf/profiles/scenarios.json 中每个场景包含Name、AppId、Tags与EndCondition。当前文件中的场景如Lifecycle-MinApp.Cpp.MUX使用ScenarioEndOnProcessExit结束条件并设 3 秒超时Tags普遍包含xamlperf与muxXaml Islands 相关场景额外带有islands标签如Lifecycle-Islands-ButtonUserControl.Cpp.MUX通过Args指定要加载的用户控件。因此userPerfTestSetxamlperf会选中全部带xamlperf标签的场景——这与文档推荐以xamlperf作为起点一致。四、在 Dev 机器上手动测试任意可执行程序4.1 环境准备Provision首先需要在测试机上构建所需的组件。在 VS Dev Command Prompt 中执行init archflavor之后进入perf\scenarios目录执行init.cmd build-version。若使用本地构建则不指定build-version但要先执行build.cmd与pack.cmd执行msb MeasureMUX-set.sln或包含你的被测应用的解决方案进入perf\scripts目录如果要在专用硬件上运行执行provision.cmd directory其中directory是接收所有需要拷贝到测试机文件的目录。命令完成后把这些文件拷到测试机上。从 config-paths.ps1 可以看到脚本如何区分三种运行环境流水线中存在BUILD_ARTIFACTSTAGINGDIRECTORY环境变量、Dev 命令行存在BinRoot此时 TAEF 与性能基础设施从 NuGet 恢复的packages/目录加载应用目录默认为%BinRoot%\%_BuildArch%%_BuildType%\Test\perf\apps、以及普通命令行从perf/下的infra、apps子目录加载。这解释了为什么本地手动测试前必须先init恢复 TAEF 与Microsoft.Internal.Performance.Infra依赖。4.2 降低系统噪声可选但强烈建议CPU 测试在系统活动更少时更可靠。强烈建议只在专用机上修改系统设置不要在你的 Dev 机上改以免弄坏开发环境。目前虽然没有官方的安静化脚本但以下改动能改善结果禁用 Prefetch将注册表项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters\EnablePrefetcher设为0禁用 CPU 降频在控制面板中把电源方案改为高性能Performance禁用 Windows Defender。4.3 执行场景UWP / Desktop 应用在scripts目录执行run-set.cmd scenarioTagsAndProfiles appsPathscenarioTagsAndProfiles指定要执行的场景与 profile 的选择条件格式为scenarioTag1[#scenarioTagN]/profileName1[#profileNameN]。scenarioTag与 scenarios.json 中场景的Tags属性匹配profileName与 profiles.json 中 profile 的Name属性匹配appsPath包含场景应用的目录路径。例如xamlperf/cpu表示执行所有带xamlperf标签的场景使用cpuprofile。从 run-set.ps1 可以看到脚本会把该参数作为--legacy-query传给ScenarioRunner.exe并附--config-file指向当前环境对应的config-user.json或config-pipeline.json脚本本身要求管理员权限。硬件计数器注意事项基础设施使用的XAML.wprp文件声明了若干硬件计数器如果测试机的 CPU 不支持全部计数器执行会以一个笼统的错误失败Error: TAEF: [HRESULT 0xC5580628] Caught critical exception during test execution. (Failed to start the EtwLogger trace.)排查方法在提权的命令提示符中运行wpr -pmcsources查看设备实际支持的计数器然后把 perf/profiles/XAML.wprp 中不适用的计数器注释掉。查看该文件可以确认具体声明的计数器——XAML_CPUprofile 挂载的HardwareCounter_PMC节点以Stricttrue声明了LLCMisses、BranchMispredictions、InstructionsRetiredFixed、UnhaltedCoreCyclesFixed四个计数器文件注释说明其中固定计数器依赖 VB 及之后的 Windows 版本Stricttrue正是不支持即报错的原因。4.4 处理 trace所有测试完成后原始 trace 会落在%LOCALAPPDATA%\WinAppPerf\current目录。进入scripts目录执行process.cmd experiment结果输出到%LOCALAPPDATA%\WinAppPerf\experiments若同名实验已存在则合并结果否则新建实验目录。这两个路径与 config-user.json 中的配置完全对应ShiftsDirectory指向%LOCALAPPDATA%\WinAppPerf\currentCsvCollator.ExperimentsDirectory指向%LOCALAPPDATA%\WinAppPerf\experimentsProcessedDataArchiveDirectory为processed。4.5 分析结果实验结果目录包含原始 trace 文件与一系列 CSV 文件根目录下有一个合并了所有运行结果的文件cumulative.csvprocessed目录下每个 shift 目录包含*.raw.csv从场景 trace 提取的原始数据可以看到场景每次运行的全部数据例如 UWP 应用在cpuprofile 下会运行多次每次迭代的值都在这里*.stat.csv从原始数据过滤得到的统计值shift.agg.csv将被合并进上层cumulative.csv的文件。4.6 场景应用一览当前用于 WinUI 性能测量 / PGO 训练的应用如下场景应用类型语言描述用途XAMLPerf.ButtonApp.Cpp.MUXUWPC225 个按钮的网格MeasureXAMLPerf.ControlsApp.Cs.MUXUWPC#多种控件与导航PGOXAMLPerf.HelloWorldApp.Cs.MUXDesktopC#简单文本渲染PGOXAMLPerf.HelloWorldApp.Cpp.MUXDesktopC简单文本渲染MeasureXAMLPerf.MinApp.Cpp.MUXUWPC用 VSIX 创建的空应用MeasureXAMLPerf.MinApp.Cs.MUXUWPC#用 VSIX 创建的空应用MeasureXAMLPerf.NavApp.Cs.MUXUWPC#NavigationView 使用MeasureXAMLPerf.ScrollingApp.Cs.MUXUWPC#多模式滚动PGOXAMLPerf.TextBlockApp.Cpp.MUXUWPC1125 个 TextBlock 的文本渲染Measure下面是使用系统 XAML 的对应应用用于与 MUX 做对比测量场景应用类型语言描述用途XAMLPerf.MinApp.Cpp.WUXUWPC用 VSIX 创建的空应用MeasureXAMLPerf.MinApp.Cs.WUXUWPC#用 VSIX 创建的空应用MeasureXAMLPerf.NavApp.Cs.WUXUWPC#NavigationView 使用MeasureMUX与WUX前缀也体现在运行脚本中run-set.ps1 的Set-WinUIVersionPrefix/Set-WUXPrefix函数会在应用根目录中匹配版本前缀目录^\d\.\d\.\d.*与WUX目录分别设置%WinUIPrefix%与%WUXPrefix%以便同一套场景框架同时定位被测版本与对照组应用。五、数据处理流水线数字是如何算出来的perf/profiles/XAML.pipeline.props.json 声明了每个 profile 处理 trace 时的具体流水线值得逐条理解因为它解释了为什么多次迭代、结果为什么是统计值SkipNRunsFilter.Count: 1——跳过第 1 次运行。首次启动包含冷启动效应代码页加载、磁盘 IO剔除后数据更稳定SkipHighDiskActivityRunsFilter.Threshold: 10.0——丢弃磁盘活动超过阈值的运行直接过滤掉机器当时很忙的坏点。这正呼应了 4.2 节降低系统噪声的动机脚本层面还有一道自动防线StatSummarizer.FilterWindowInStdDev: 1.0——以标准差为窗口的统计汇总器把多次迭代压缩为带统计意义的数值*.stat.csv的来源启动时间测量——TimeDeltaExtractor以进程启动为起点、以Microsoft-Windows-XAML提供者的两个事件为终点事件Id 65FrameEnd测得Startup, Proc区间事件Id 31InitializeCore测得Startup, PreInitCore区间。也就是说启动时长的口径是 XAML 框架自己的 ETW 事件而非简单的进程创建时间ROIExtractor.RoiFilename: XAML.regions.xml——按 XAML.regions.xml 定义的区域提取感兴趣区间的指标AliasingFilter.Aliases——把形如xamlperf.cs.mux.x64...的应用名统一归一化为[PERFAPP]把各版本的 .NET / VCLibs 库名归一化使不同版本的 trace 可以横向对比。WPR 采集侧对应地定义在 XAML.wprp 中XAMLBaseProfile采集Microsoft-Windows-XAMLLevel 4与Microsoft-Windows-Immersive-Shell事件XAML_CPU在其上追加 PMC 硬件计数器采集器XAML_Memory追加ReferenceSet相关的内核关键字FootPrint、HardFaults、Memory、ReferenceSet等注释指出FileIO系列关键字是使用 ReferenceSet 时避免崩溃的必需项与Win32HeapRanges提供器。每个 profile 都有.Memory写内存与.File写文件两种LoggingMode变体profiles.json中的Filemode: true即选用文件模式。六、搭建 Azure 自托管物理性能机需要更高保真度真实硬件、固定环境时可以按以下步骤搭建一台 Azure 自托管性能机安装指定版本的 Windows。强烈建议选择 LTSC 版本更新频率低、预装应用与服务更少。当前安装镜像为20H2 LTSC创建名为perftest的本地管理员用户安装并配置 Azure 自托管代理参考 Azure DevOps 自托管代理的安装文档关键设置如下节选C:\vsts-agent-win-x64-2.185.1config ... Enter server URL https://dev.azure.com/your-org Enter authentication type (press enter for PAT) Enter personal access token **************************************************** ... Enter agent pool (press enter for default) WinUI-PerfTest Enter agent name (press enter for DESKTOP-Q6QS2SB) ... Enter work folder (press enter for _work) Enter Perform an unzip for tasks for each step. (press enter for N) Enter run agent as service? (Y/N) (press enter for N) Enter configure autologon and run agent on startup? (Y/N) (press enter for N) y Enter User account to use for autologon perftest Enter Password for the account DESKTOP-Q6QS2SB\perftest ********* ... Enter Restart the machine at a later time? (Y/N) (press enter for N) y先不要重启——还有一处必须修改。默认情况下代理启动时以非提权用户上下文运行但运行 ETWLogger 需要提权上下文。变通方案打开 regedit进入HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\RunAzure 代理应已创建类似这样的键值VSTSAgent C:\WINDOWS\system32\cmd.exe /D /S /C start Agent with AutoLogon C:\vsts-agent-win-x64-2.185.1\run.cmd --startuptype autostartup将该键值内容复制进文本文件c:\start-agent.cmd把注册表键值替换为VSTSAgent powershell -Command Start-Process c:\start-agent.cmd -Verb RunAs最后禁用管理员提示使代理重启后无需人工干预即可启动搜索secpol.msc进入Local Policies Security Options User Account Control: Behavior of the elevation prompt for administrators in Admin Approval Mode将其改为Elevate without prompting禁用杂项启动项搜索 Startup apps关闭除 Azure 自托管代理启动命令以外的所有不需要项编译并部署 perf 基础设施在 Dev 机上把开发环境初始化为x64fre进入perf\scripts目录执行provision network-share-path选择性能机可访问的共享目录在性能机上从 perf 分析共享目录拷贝安静化 TAEF 测试xcopy perf-share\bin\Microsoft.PerfGates.Test.Config.dll c:\perf\test /y确保性能机对存放结果的共享目录有读写权限例如在提供共享的机器上创建本地用户本例为nunatak\perftest并在性能机上保存这些凭据搜索 Developer Settings 并启用开发者模式安装 x64 版本的 Visual C 运行库Redistributable安装并启动 TAEF 服务从相应的内部分发位置拷贝 TAEF 二进制从提权提示符执行wex.services.exe /install:te.service /localonly /runas:system net start system安装 Python 3.11从官方站点用于报告生成为方便起见建议为所有用户安装到c:\python311。Python 对应的是perf/vis目录下的报告工具链perf/vis 中可见vis.sln与多个 Python 模块。七、小结与延伸阅读整套框架的设计思路可以概括为用 WPR/ETW 做精确采集XAML.wprp用多轮迭代 统计过滤抗噪SkipNRuns、磁盘活动过滤、标准差窗口用统一口径的 XAML ETW 事件定义启动等关键指标再用 CSV 分层raw → stat → agg → cumulative沉淀为可比较的实验数据最后由 Python 工具perf/vis生成 HTML 报告与历史曲线。三条使用路径——CI 自动监控、Azure DevOps 自助实验、Dev 机手动测试——共享同一套配置中枢perf/profiles/因此本地测量与流水线测量的数据口径是一致的这也是不同运行之间比较有意义的根本保证。同目录下另有两篇文档可配合阅读perf-etw.mdETW 事件与 trace 分析相关说明perf-pgo.mdPGO 训练流程——本文场景表中 Used in: PGO 的应用即服务于该流程。【免费下载链接】microsoft-ui-xamlWinUI: a modern UI framework with a rich set of controls and styles to build dynamic and high-performing Windows applications.项目地址: https://gitcode.com/GitHub_Trending/mi/microsoft-ui-xaml创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价