我需要在 Cygwin 环境中对某些命令的速度进行基准测试bash
,并确保我运行的测试不会影响 Windows 缓冲区或缓存。虽然我是在环境中进行基准测试bash
,但我怀疑所有缓存都是由 Windows 本身而不是 Cygwin 完成的。
在基于Unix的系统,您可以执行以下操作来清除所有缓存和缓冲区:
echo 3 > /proc/sys/vm/drop_caches
在 Windows 上,这个命令的等效项是什么?
答案1
Twisty 是正确的,Windows 中没有本机工具可以执行此操作。
然而,在做了进一步的研究和测试后,似乎即使是 SysInternals 的同步工具也没有真正清除 Windows 用于缓存文件和数据的内存 - 也就是所谓的文件系统缓存,Windows 称之为待机内存. 可以使用以下方法演示内存地图,另一个 SysInternals 工具,用于监视 Windows 中所有内存分配。
在运行该工具之前和之后检查 RAMMap 的待机内存列Sync
显示,Windows 的待机内存在运行之前和之后几乎保持不变Sync
。事实上,Sync
似乎对内存没有任何明显的影响,据我所知,这对于性能测试来说基本上是无用的。
不过,我确实发现了一种有效的编程方法来清除 Windows 的待机列表,其形式是空待机列表,来自 Wen Jia Liu 的一个简单命令行程序:
EmptyStandbyList.exe 是 Windows(Vista 及更高版本)的命令行工具,可以清空:
- 进程工作集
- 修改后的页面列表
- 备用列表(优先级 0 至 7)
- 仅限优先级 0 候补列表
要使用它,你需要确保空待机列表文件位于系统 PATH 环境变量中的位置,然后EmptyStandbyList.exe
在需要刷新内存时从 shell 或脚本中调用。
在CMD
:
EmptyStandbyList.exe
并且bash
:
cmd \/c EmptyStandbyList.exe
为了确认执行后 Windows 的待机内存已成功清除,您可以再次使用 RAMMap。
跑步前EmptyStandbyList.exe
跑步后EmptyStandbyList.exe
答案2
Windows 中没有内置等效命令。不过微软免费提供这同步命令,它会按照您的要求将未写入的数据刷新到磁盘。它是 SysInternals 工具套件的一部分。
这是描述作者的话:
UNIX 提供了一个名为 Sync 的标准实用程序,它可用于指示操作系统将所有文件系统数据刷新到磁盘,以确保其稳定,并且在系统发生故障时不会丢失。否则,缓存中存在的任何修改数据都将丢失。这是我编写的等效程序,称为 Sync,适用于所有版本的 Windows。每当您想知道修改的文件数据是否安全地存储在硬盘上时,都可以使用它。
您需要管理权限才能运行该命令。要刷新全部磁盘,只需运行:
sync
如果您只想定位单个驱动器,例如C:
使用:
sync c:
您还可以使用以下命令仅刷新可移动驱动器:
sync -r
此实用程序适用于 Vista/Server 2008 及更高版本的所有 Windows 版本。