Windows 10下如何确保基准测试前文件未被缓存?
针对Windows 10冷缓存文件读取基准测试的优化方案
无需重启的缓存清理方法
1. 内存压力法(最简便)
利用Windows的缓存置换机制,创建一个比物理内存略大的临时文件,把现有缓存挤出去:
# 创建65GB的临时文件(略大于你的64GB内存) fsutil file createnew C:\temp\cachefiller.dat 68719476736 # 删除临时文件,释放磁盘空间 del C:\temp\cachefiller.dat
执行完这两步后,系统会把之前缓存的测试文件内容全部置换到磁盘,实现冷缓存效果。
2. 精准清理单个文件缓存
使用Sysinternals的CacheSet工具,它可以针对性清除指定文件的缓存:
- 运行工具后选择
Purge功能,或者通过命令行指定测试文件路径,就能只清理目标文件的缓存,不会影响系统其他缓存。
3. 程序化集成清理(适合自动化测试)
如果要在基准测试代码里直接处理缓存,可以调用Windows API:
- 先关闭测试文件的句柄,然后调用
EmptyWorkingSet(GetCurrentProcess())释放当前进程的工作集缓存; - 更彻底的方式是使用
NtSetSystemInformationAPI调整系统缓存大小,不过需要管理员权限。
验证缓存状态
打开资源监视器→切换到「磁盘」标签→在「关联的文件」里找到你的测试文件,查看「缓存的字节」列,数值接近0就说明缓存已清除。
关于你现有重启方案的说明
重启确实能清空缓存,而且你的测试文件不是可执行/DLL,不会被Superfetch预加载,符合冷缓存场景,但频繁重启太耗时,完全没必要。
关键注意事项
- 别用
FILE_FLAG_NO_BUFFERING,它会绕过所有缓存(包括驱动预读),不符合你要模拟的真实冷缓存场景; - 测试前关闭其他磁盘读写密集的程序,避免干扰缓存状态;
- 你关注的是接口开销而非绝对速度,所以HDD/SSD的差异不影响测试结论。
内容的提问来源于stack exchange,提问作者Adrian McCarthy
相关产品推荐
相关产品推荐

