把现有的 DiskSpd batch 脚本升级成一个可打包的 Windows 命令行程序,保留现有测试逻辑,早期以 CrystalDiskMark-like 体验起步,中期加入 GUI,后期扩展为多引擎、多任务的高级工具,始终走差异化路线,不与专业工具正面竞争。
- Python 3.13+
- PyInstaller onedir 打包
- JSON 配置文件(
Config/目录下多文件) - 外部工具内置:DiskSpd.exe、RAMMap.exe(开发者在本地
Tools/放置,打包脚本复制)
D:\Coding\Dite\
├── AGENTS.md # 项目交接文档
├── PLAN.md # 本计划
├── README.md # 用户说明文档
├── main.py # PyInstaller 打包入口
├── build.py # PyInstaller 打包脚本
├── Config\ # 配置目录(扁平,无子目录)
│ ├── tools.json # 工具 exe 路径
│ ├── engine_defaults.json # 引擎级默认参数
│ ├── tasks.json # 共享 task 定义
│ ├── presets.json # 内置 3 个预设
│ ├── settings.json # 预留:GUI/用户偏好
│ └── Custom_*.json # 用户自定义预设(放即生效)
├── 版本演变分析报告.md # 版本记录
├── 文章20260624.md # 文章草稿
├── DiskSpd_CrystalDiskMark-Like_V17.bat # 脚本最终版
├── DiskSpd_Realistic_V17.bat # 脚本最终版
├── Archive\ # 旧版本归档总目录
│ ├── Early\ # 脚本时代产物
│ │ ├── Data\ # 旧表格 / 记录 / 图表
│ │ ├── RawOut\ # 脚本历史日志
│ │ │ ├── V1-V9\
│ │ │ ├── V10-V16\
│ │ │ └── CrystalDiskMark\
│ │ └── Source\ # 旧 bat 脚本,平铺
│ ├── V20\ # V20 Python 源码归档
│ │ ├── Source\ # Python 源码
│ │ ├── presets.json
│ │ ├── main.py
│ │ └── build.py
│ ├── V21\ # V21 Python 源码归档(V22 升级前快照)
│ │ ├── Source\ # Python 源码
│ │ ├── presets.json
│ │ ├── main.py
│ │ └── build.py
│ ├── V22\ # V22 Python 源码归档(V23 升级前快照)
│ │ ├── Source\ # Python 源码
│ │ ├── Config\ # 配置文件快照
│ │ ├── main.py
│ │ └── build.py
│ └── V23\ # V23 Python 源码归档(V24 升级前快照)
│ ├── Source\ # Python 源码
│ ├── Config\ # 配置文件快照
│ ├── main.py
│ └── build.py
├── Source\ # Python 源码 V24+,平铺
│ ├── engines\ # 引擎实现子包
│ │ ├── base.py
│ │ ├── cache_clear.py
│ │ ├── diskspd.py
│ │ ├── filegen.py
│ │ ├── fio.py
│ │ └── robocopy.py
│ ├── __main__.py
│ ├── cli.py
│ ├── config.py
│ ├── context.py
│ ├── formatter.py
│ ├── scheduler.py
│ └── utils.py
├── Outputs\ # 程序运行日志
├── Release\ # 发布分发包
│ └── Dite_V24_x64.7z # V24 Windows x64 分发包
├── Tools\ # 外部工具(diskspd.exe / RAMMap.exe)
├── DevTool\ # 开发辅助脚本
├── Temp\ # 临时目录,随时清空
├── RawOut\ # 脚本 V17 输出日志
└── Data\ # 数据
- 项目内所有文件只保留一份,不允许外面一份、文件夹里一份。
- 文档、最新数据、脚本最后一版保留在根目录。
Archive是所有历史归档的总目录,项目内不再设置其他archive。Archive/Early/汇总脚本时代的产物,其下Source/平铺所有旧 bat,不再子目录。Archive/Early/RawOut/下 3 个子目录分别存放对应阶段日志。Archive/V20/存放 V20 Python 源码归档。Archive/V21/存放 V21 Python 源码归档。Archive/V22/存放 V22 Python 源码归档。Archive/V23/存放 V23 Python 源码归档。Source/下直接平铺.py文件;多引擎实现放在Source/engines/子包中。Release/存放对外发布包,命名规则<Program>_<Version>_<Arch>.7z。Temp/随时清空,运行期使用。
- 脚本阶段版本号到 V17 结束。
- Python 程序阶段版本号从 V20 开始,当前已迭代至 V24。
- 启动后提示输入目标磁盘盘符,默认取程序所在磁盘。
- 提示选择预设:1 = CrystalDiskMark-Like,2 = Realistic,3 = Fast;输入其他提示“尚在开发中”。
- 读取
presets.json加载预设参数。 - 执行与 V17 脚本等价的流程:
- 初始写入测速
- 计算并执行填充
- RAMMap 清缓存
- 先全部读测试,再全部写测试
- 解析 MiB/s 并输出 Summary
- 输出 txt 日志,保存为
Dite_V20_<盘符>-disk_<预设名>_<时间戳>.log,以 UTF-8 with BOM 保存。
Source/ (平铺)
__main__.py # 包入口(python -m Source)
cli.py # 交互提示
config.py # 预设、配置加载
runner.py # 测试流程编排(V20)
engine_base.py # Engine 抽象接口
engine_diskspd.py # DiskSpd 实现
engine_fio.py # FIO 预留空接口
engine_native.py # 原生引擎预留
utils.py # 管理员检测、日志命名、速度解析
main.py # PyInstaller 打包入口(根目录)
build.py # PyInstaller 打包脚本(根目录)
presets.json # 预设配置(根目录)
- 管理员检测:未提升权限时提示并退出;打包后的 exe 附带 requireAdministrator manifest。
- 工具路径解析:优先使用同目录
Tools/,再回退到 PATH。 - DiskSpd 命令构造保持与 V17 完全一致,参数顺序特别注意
-d在目标文件之前。 - 速度解析:通过
subprocess.run(..., capture_output=True)拿到 stdout,正则匹配Total IO后第一行total:的 MiB/s;失败时回退到首个不含Read IO的total:行。 - 浮点速度处理:直接用 Python float 计算 fill time,避免 batch 的整数截断问题。
- 实现基于
schedule的预设配置:每个预设由tasks+schedule组成。 - 支持逻辑操作:
measure、fill、run、repeat、summary。 - 支持三种预设:CrystalDiskMark-Like、Realistic、Fast。
- 命令行参数支持
--disk、--preset、--config、--no-pause。 - 失败时清理测试文件并输出错误原因。
- 使用
TeeStream统一捕获屏幕输出和日志文件,日志与屏幕内容一致。 - 未提升管理员权限时打印警告并继续运行;
admin_mode: "require"的步骤会被自动跳过。 - 控制台输出强制 UTF-8,避免中文乱码。
Source/
__main__.py # 包入口、Tee 日志、参数解析、主流程
cli.py # 交互提示
config.py # 配置与预设模型、JSON 加载
context.py # 运行时上下文(盘符、管理员、结果、变量、测试文件路径)
formatter.py # 标题与日志文件名格式化
scheduler.py # 任务调度器:measure / fill / run / repeat / summary
utils.py # 管理员检测、项目根目录、测试文件清理
engines/ # 引擎子包
__init__.py # 引擎注册与构建
base.py # Engine 抽象接口与 EngineResult
diskspd.py # DiskSpd 引擎
cache_clear.py # RAMMap 缓存清理引擎
fio.py # FIO 预留引擎
robocopy.py # RoboCopy 预留引擎
main.py # PyInstaller 入口
build.py # PyInstaller 打包脚本
presets.json # 预设配置
- 调度层
scheduler.py根据ScheduleStep.admin_mode跳过需要管理员权限的步骤。 - 引擎层
cache_clear.py在未提升权限时返回returncode=1,作为安全兜底。 TeeStream将sys.stdout/sys.stderr同时输出到屏幕和日志缓冲区,缓冲区中\r\n/\r统一替换为\n。- 日志文件以 UTF-8 with BOM 写入,文件名前缀为
Dite_V22_。 - 打包脚本
build.py先构建Dite_V22.exe,再重命名为Dite.exe;输出目录保持dist/Dite_V22/。
- V21 源码归档至
Archive/V21/,版本标识升级为 V22。 - 重构配置系统:从单文件
presets.json拆分为Config/目录下多个扁平文件。 - 引入共享
tasks.json、引擎默认engine_defaults.json、工具路径tools.json。 Config/Custom_*.json自动识别为用户自定义预设,追加到菜单末尾。- 新增 CopyCross 预设组(11-17),基于 RoboCopy 实现跨盘真实数据复制测试。
- 新增
filegen引擎,基于 CSPRNG + XOR 生成高质量随机测试数据。 - 新增异步管线模拟模式(16-17),多线程并发生成、复制、清理。
- RoboCopy 引擎支持中英文双语输出解析,
/NFL抑制文件列表。 - 新增
simulate、store、verify、cleanup调度动作。 - 预设重新排序:Realistic 移至第 1 位,1-9 为 DiskSpd 预设。
- V22 源码归档至
Archive/V22/,版本标识升级为 V23。 - 新增 CSV 结构化数据输出(
Source/csv_writer.py),每次测试同步生成.csv到Outputs/。- 列结构:测试时间、盘符、工具、预设、指标名、指标值、单位、日志文件名。
- 参考根路径旧版 CSV 汇总表
原始数据0x-xxx_Latest.csv的双语表头风格。
- 新增数据后处理展示模块(
Source/postproc.py),读取历史 CSV 生成对比表格。 .gitignore全面锁定,排除非源码目录(Tools/、Data/、DevTool/、RawOut/、Release/、.csv、.xlsx)。
- V23 源码归档至
Archive/V23/,版本标识升级为 V24。 - DiskSpd 引擎新增
-L延迟采集支持,解析 IOPS 与多粒度延迟(avg / min / max / p25 / p50 / p75 / p90 / p95 / p99 / p99.9 … p99.9999999)。 engine_defaults.json中measure_latency默认启用,summary输出同时展示 Speed、IOPS、Latency。repeat调度动作支持多指标独立聚合:可对每个指标分别指定mean/max/min,未显式指定的数值指标默认mean。- CrystalDiskMark 行为预设(5-9)的
repeat改为对 speed / iops 取max、对latency_p99_ms取min,更贴近 CrystalDiskMark 的取最高成绩逻辑。 - 删除旧
measure调度动作,统一使用run + store。 fill动作重命名为diskspd_fill,明确其为 DiskSpd 专属填充步骤。- 后续计划(暂缓):
summary通用化、CSV 输出与后处理重构、simulate能力增强、FIO/原生引擎、GUI。
- 框架待定(PyQt6 / PySide6 / Dear PyGui 等中后期评估)。
- 图形化选择磁盘、预设、显示实时输出和 Summary。
- 实现 FIO 引擎。
- 原生引擎(Windows API)调研与实现。
- 多任务队列、对比报告、结果数据库等。
- 不追求替代 Iometer、CrystalDiskMark 等专业工具。
- 主打“预设即开即用 + 真实世界大文件测试 + 后续多引擎对比”。
- 先满足个人评测工作流,再逐步开放。
- PyInstaller onedir 输出到
dist/Dite_V24/(已被.gitignore忽略)。 build.py会把Tools/、Config/复制到打包输出目录。- 打包产物中的可执行文件为
Dite.exe;发布包为Release/Dite_V24_x64.7z。 .gitignore已配置,忽略 Python 缓存、PyInstaller 中间产物、Outputs/、Temp/、Tools/、Data/、DevTool/、RawOut/、Release/、Old/、OldData/、.csv、.xlsx 等。