通过 SRUM 数据库对各个应用的耗电量进行分析的工具报告(附源码)

目录

一、引言

1.1 文档目的

1.2 工具背景

1.3 适用范围

二、工具设计概述

2.1 整体架构

2.2 核心组件

三、功能模块详解

3.1 数据采集层

3.1.1 SRUM数据生成

3.1.2 进程信息采集

3.1.3 应用信息补充采集

3.2 数据处理层

3.2.1 SRUM数据解析

3.2.2 进程名归一化

3.2.3 时间分段统计

3.3 报告生成层

3.3.1 报告数据结构

3.3.2 报告输出格式

3.4 存储与维护

3.4.1 临时文件管理

3.4.2 过期报告清理

四、功能标准化规范

4.1 数据格式标准

4.2 接口规范

4.2.1 核心类接口

4.2.2 辅助工具接口

4.3 异常处理规范

4.4 线程安全规范

五、使用流程标准化

5.1 启动流程

5.2 分析流程(单次)

5.3 停止流程

六、扩展建议

七、总结

八、附录

8.1 术语表

8.2 依赖说明

九、源码


一、引言

1.1 文档目的

本文档旨在规范SRUM(System Resource Usage Monitor,系统资源使用监控)耗电量分析工具的设计标准、功能边界及实现规范,为工具的开发、维护及扩展提供统一依据。

1.2 工具背景

SRUM是Windows系统内置的资源使用监控机制,记录了进程的资源消耗(如CPU、磁盘、网络等)。本工具通过解析SRUM数据(借助powercfg /srumutil命令导出),结合进程信息、注册表应用数据及快捷方式解析,实现应用程序耗电量的量化分析与报告生成,帮助用户识别高耗电应用。

1.3 适用范围

本工具适用于Windows 10及以上系统,支持对本地进程的耗电量进行周期性监控、分析及报告输出,可用于系统优化、能耗管理等场景。

二、工具设计概述

2.1 整体架构

工具采用分层设计,分为**数据采集层**、**数据处理层**、**报告生成层**及**存储与输出层**,各层职责清晰、接口标准化。

2.2 核心组件

组件名称

核心职责

实现类/模块

SRUM数据采集器

调用powercfg生成SRUM数据(CSV格式)

SrumPowerAnalyzer::GenerateSrumData

进程信息枚举器

获取系统进程的路径、描述、产品名等信息

SrumPowerAnalyzer::EnumAllProcesses

应用信息解析器

从注册表、快捷方式提取应用名与路径映射

RegAppInfo相关工具类、BuildExeToAppNameMap

数据处理器

解析CSV、归一化进程名、计算时段耗电量

ParseCsvFileNormalizeDisplayNameGenerateReport

报告生成器

按时间段生成结构化报告,支持文件与控制台输出

SaveReportToFilePrintReportToConsole

周期调度器

控制分析任务的周期性执行,支持启停管理

StartAnalysisStopAnalysisRunPeriodically

三、功能模块详解

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获取进程路径。

    • 从可执行文件的版本资源中提取FileDescriptionProductName(通过GetFileVersionInfoA+VerQueryValueA)。

  • 标准化要求

    • 进程路径需统一转换为小写、反斜杠(\)分隔格式(如c:\program files\app\app.exe)。

3.1.3 应用信息补充采集
  • 功能描述:从注册表及快捷方式中提取应用名与可执行文件的映射关系,用于进程名归一化。

  • 采集来源及优先级:

    • 桌面快捷方式CSIDL_DESKTOPCSIDL_COMMON_DESKTOPDIRECTORY):解析.lnk文件获取目标路径与应用名。

    • 开始菜单快捷方式CSIDL_STARTMENUCSIDL_COMMON_STARTMENU):补充桌面未覆盖的应用。

    • 注册表HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstallHKCU对应路径):提取DisplayNameInstallLocationDisplayIcon(主程序路径)。

3.2 数据处理层

3.2.1 SRUM数据解析
  • 功能描述:解析CSV格式的SRUM数据,提取进程名、总耗电量(mWh)及最后更新时间戳。

  • 关键字段映射

    • 进程名:CSV第1列(需去除引号)。

    • 总耗电量:CSV第26列(转换为double类型,单位mWh)。

    • 时间戳:CSV第3列(支持YYYY-MM-DDTHH:MM:SSYYYY-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类提供标准化接口,参数与返回值需严格遵循:

接口名

功能

参数

返回值

StartAnalysis

启动周期性分析

interval_minutes(分析间隔,分钟)、output_dir(报告输出目录)

StopAnalysis

停止分析

GenerateReport

生成单时段报告

原始数据、当前时间、时段长度(秒)、时段名称、筛选阈值(%)

TimePeriodReport

4.2.2 辅助工具接口

reg_appname_utils模块提供注册表应用信息解析接口,需满足:

接口名

功能

参数

返回值

EnumUninstallApps

枚举注册表中的应用信息

std::vector<RegAppInfo>(应用列表)

FindAppNameFromRegByExePath

按进程路径查找注册表应用名

进程路径、注册表应用列表

应用名(空字符串表示未找到)

4.3 异常处理规范

  • 系统调用失败(如OpenProcessRegOpenKeyExA):需记录错误码(通过GetLastError)及详细信息(如“获取进程路径失败,PID=1234”)。

  • 文件操作失败(如无法创建报告文件):需输出错误日志并跳过本次操作,不中断整体流程。

  • 数据解析失败(如CSV格式异常):跳过无效行,继续解析其余数据。

4.4 线程安全规范

  • 共享资源(如display_name_cache_)需通过互斥锁(std::mutex)保护,确保多线程环境下的操作安全。

  • 周期性分析线程(analysis_thread_)需通过原子变量(running_)控制启停,避免线程泄漏。

五、使用流程标准化

5.1 启动流程

  1. 初始化:调用SrumPowerAnalyzer构造函数,完成COM库初始化、设备路径映射构建、进程信息枚举、注册表应用信息加载。

  2. 配置参数:指定分析间隔(默认60分钟)及报告输出目录(默认工具所在目录)。

  3. 启动分析:调用StartAnalysis,工具进入周期性任务循环。

5.2 分析流程(单次)

  1. 生成SRUM数据:调用powercfg生成CSV文件。

  2. 解析数据:提取进程名、耗电量、时间戳,过滤无效数据。

  3. 数据处理:归一化进程名,按时间段统计耗电量。

  4. 生成报告:输出文件与控制台报告。

  5. 清理资源:删除临时CSV文件,清理过期报告。

5.3 停止流程

  1. 调用StopAnalysis,设置running_false,等待分析线程退出。

  2. 析构SrumPowerAnalyzer,释放COM库资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值