目录
一、引言
1.1 文档目的
本文档旨在规范SRUM(System Resource Usage Monitor,系统资源使用监控)耗电量分析工具的设计标准、功能边界及实现规范,为工具的开发、维护及扩展提供统一依据。
1.2 工具背景
SRUM是Windows系统内置的资源使用监控机制,记录了进程的资源消耗(如CPU、磁盘、网络等)。本工具通过解析SRUM数据(借助powercfg /srumutil
命令导出),结合进程信息、注册表应用数据及快捷方式解析,实现应用程序耗电量的量化分析与报告生成,帮助用户识别高耗电应用。
1.3 适用范围
本工具适用于Windows 10及以上系统,支持对本地进程的耗电量进行周期性监控、分析及报告输出,可用于系统优化、能耗管理等场景。
二、工具设计概述
2.1 整体架构
工具采用分层设计,分为**数据采集层**、**数据处理层**、**报告生成层**及**存储与输出层**,各层职责清晰、接口标准化。
2.2 核心组件
组件名称 |
核心职责 |
实现类/模块 |
SRUM数据采集器 |
调用 |
|
进程信息枚举器 |
获取系统进程的路径、描述、产品名等信息 |
|
应用信息解析器 |
从注册表、快捷方式提取应用名与路径映射 |
|
数据处理器 |
解析CSV、归一化进程名、计算时段耗电量 |
|
报告生成器 |
按时间段生成结构化报告,支持文件与控制台输出 |
|
周期调度器 |
控制分析任务的周期性执行,支持启停管理 |
|
三、功能模块详解
3.1 数据采集层
3.1.1 SRUM数据生成
-
功能描述:通过调用Windows系统命令
powercfg /srumutil /output <路径>
生成包含进程资源消耗的CSV文件(临时存储于系统临时目录)。 -
标准化要求:
-
临时文件命名格式:
srumutil_<时间戳>.csv
(时间戳格式:YYYYMMDD_HHMMSS
)。 -
若命令执行失败(返回非零退出码),需记录错误日志并跳过本次分析。
-
3.1.2 进程信息采集
-
功能描述:枚举系统所有进程,获取进程ID(PID)、父进程ID(PPID)、完整路径、描述信息及产品名。
-
实现方式:
-
调用
CreateToolhelp32Snapshot
枚举进程,通过OpenProcess
+QueryFullProcessImageNameA
获取进程路径。 -
从可执行文件的版本资源中提取
FileDescription
和ProductName
(通过GetFileVersionInfoA
+VerQueryValueA
)。
-
-
标准化要求:
-
进程路径需统一转换为小写、反斜杠(
\
)分隔格式(如c:\program files\app\app.exe
)。
-
3.1.3 应用信息补充采集
-
功能描述:从注册表及快捷方式中提取应用名与可执行文件的映射关系,用于进程名归一化。
-
采集来源及优先级:
-
桌面快捷方式(
CSIDL_DESKTOP
、CSIDL_COMMON_DESKTOPDIRECTORY
):解析.lnk
文件获取目标路径与应用名。 -
开始菜单快捷方式(
CSIDL_STARTMENU
、CSIDL_COMMON_STARTMENU
):补充桌面未覆盖的应用。 -
注册表(
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
及HKCU
对应路径):提取DisplayName
、InstallLocation
、DisplayIcon
(主程序路径)。
-
3.2 数据处理层
3.2.1 SRUM数据解析
-
功能描述:解析CSV格式的SRUM数据,提取进程名、总耗电量(mWh)及最后更新时间戳。
-
关键字段映射:
-
进程名:CSV第1列(需去除引号)。
-
总耗电量:CSV第26列(转换为
double
类型,单位mWh)。 -
时间戳:CSV第3列(支持
YYYY-MM-DDTHH:MM:SS
或YYYY-MM-DD HH:MM:SS
格式,转换为time_t
)。
-
-
过滤规则:仅保留
.exe
进程(不区分大小写),且耗电量>0、时间戳有效(>0)的数据。
3.2.2 进程名归一化
-
功能描述:将原始进程名(如
app.exe
)映射为用户易理解的应用名(如“微信”),解决“同一应用多进程路径不同”的问题。 -
归一化优先级(从高到低):
-
桌面/开始菜单快捷方式中记录的应用名。
-
注册表中匹配的
DisplayName
。 -
可执行文件的
ProductName
(版本资源)。 -
可执行文件的
FileDescription
(版本资源)。 -
原始进程名(
.exe
后缀保留)。
-
-
缓存机制:使用线程安全缓存(
display_name_cache_
)存储归一化结果,减少重复计算(缓存键为原始进程路径,值为归一化名称)。
3.2.3 时间分段统计
-
功能描述:按预设时间段(过去6小时、12小时、24小时、7天)统计各应用的总耗电量,并计算占比。
-
统计规则:
-
时间段内的应用耗电量为该时段内所有相关进程记录的耗电量总和。
-
仅保留占比超过阈值(默认2.0%)的应用,减少报告冗余。
-
3.3 报告生成层
3.3.1 报告数据结构
统一采用TimePeriodReport
结构体存储单时间段报告数据,包含:
struct TimePeriodReport {
std::string period_name; // 时间段名称(如“过去6小时”)
time_t start_time; // 开始时间(时间戳)
time_t end_time; // 结束时间(时间戳)
double total_power; // 总耗电量(mWh)
double threshold_percentage; // 筛选阈值(%)
std::vector<std::pair<std::string, double>> top_processes; // 应用名-占比(%)
};
3.3.2 报告输出格式
-
文件输出:
-
路径:用户指定目录(默认工具所在目录),文件名格式:
SRUM_Analysis_<时间戳>.txt
(时间戳为分析执行时间)。 -
内容:包含分析时间、数据时间范围、各时段总耗电量、应用排行(含名称、耗电量、占比、路径)。
-
-
控制台输出:
-
格式与文件输出一致,需支持UTF-8编码(通过
SetConsoleOutputCP(CP_UTF8)
设置)。
-
3.4 存储与维护
3.4.1 临时文件管理
-
生成的SRUM临时CSV文件(
srumutil_<时间戳>.csv
)需在分析完成后自动删除,避免磁盘占用。
3.4.2 过期报告清理
-
定期(每次分析前)清理输出目录中超过2天的报告文件(通过
CleanupOldFiles
实现),文件名需以SRUM_Analysis_
为前缀。
四、功能标准化规范
4.1 数据格式标准
-
时间戳:统一使用
time_t
类型(秒级),格式化字符串采用YYYY-MM-DD HH:MM:SS
(如2025-07-22 15:30:00
)。 -
耗电量单位:固定为毫瓦时(mWh),保留2位小数。
-
路径格式:统一转换为小写、反斜杠(
\
)分隔,去除引号(如"C:/Program Files/App.exe"
→c:\program files\app.exe
)。
4.2 接口规范
4.2.1 核心类接口
SrumPowerAnalyzer
类提供标准化接口,参数与返回值需严格遵循:
接口名 |
功能 |
参数 |
返回值 |
|
启动周期性分析 |
|
无 |
|
停止分析 |
无 |
无 |
|
生成单时段报告 |
原始数据、当前时间、时段长度(秒)、时段名称、筛选阈值(%) |
|
4.2.2 辅助工具接口
reg_appname_utils
模块提供注册表应用信息解析接口,需满足:
接口名 |
功能 |
参数 |
返回值 |
|
枚举注册表中的应用信息 |
无 |
|
|
按进程路径查找注册表应用名 |
进程路径、注册表应用列表 |
应用名(空字符串表示未找到) |
4.3 异常处理规范
-
系统调用失败(如
OpenProcess
、RegOpenKeyExA
):需记录错误码(通过GetLastError
)及详细信息(如“获取进程路径失败,PID=1234”)。 -
文件操作失败(如无法创建报告文件):需输出错误日志并跳过本次操作,不中断整体流程。
-
数据解析失败(如CSV格式异常):跳过无效行,继续解析其余数据。
4.4 线程安全规范
-
共享资源(如
display_name_cache_
)需通过互斥锁(std::mutex
)保护,确保多线程环境下的操作安全。 -
周期性分析线程(
analysis_thread_
)需通过原子变量(running_
)控制启停,避免线程泄漏。
五、使用流程标准化
5.1 启动流程
-
初始化:调用
SrumPowerAnalyzer
构造函数,完成COM库初始化、设备路径映射构建、进程信息枚举、注册表应用信息加载。 -
配置参数:指定分析间隔(默认60分钟)及报告输出目录(默认工具所在目录)。
-
启动分析:调用
StartAnalysis
,工具进入周期性任务循环。
5.2 分析流程(单次)
-
生成SRUM数据:调用
powercfg
生成CSV文件。 -
解析数据:提取进程名、耗电量、时间戳,过滤无效数据。
-
数据处理:归一化进程名,按时间段统计耗电量。
-
生成报告:输出文件与控制台报告。
-
清理资源:删除临时CSV文件,清理过期报告。
5.3 停止流程
-
调用
StopAnalysis
,设置running_
为false
,等待分析线程退出。 -
析构
SrumPowerAnalyzer
,释放COM库资源。