我正在编写磁盘密集型win32程序。第一次运行时,它使用FindFirstFile()/ FindNextFile()扫描用户的文件夹时运行速度慢很多。
如何在不重启的情况下重复首次演出?有没有办法强制系统丢弃其磁盘缓存中的所有内容?
我知道如果我正在读取单个文件,我可以通过将FILE_FLAG_NO_BUFFERING标志传递给对CreateFile()的调用来禁用缓存。但是在搜索文件时似乎无法做到这一点。
答案 0 :(得分:3)
您是否考虑过在不同的音量上进行操作,以及拆卸/重新安装音量?这将导致绝大多数所有内容都从磁盘重新读取(虽然缓存下来不会关心)。
答案 1 :(得分:1)
您需要创建足够的内存压力,以使内存管理器和缓存管理器丢弃以前的缓存结果。对于缓存管理器,您可以尝试在启用缓存的情况下打开一个较大的(即物理RAM大于物理RAM)文件,然后向后读取它(以避免任何顺序I / O优化)。 vm和缓存管理器之间的交互稍微复杂一些,并且更依赖于os版本。
控制器上也有缓存(可能,但不太可能)和磁盘驱动器本身(可能)。有特定的IoCtls来刷新这个缓存,但根据我的经验,磁盘固件在这个领域尚未经过测试。
答案 2 :(得分:1)
通过SysInternals查看CacheSet的清除功能。
答案 3 :(得分:0)
您可以使用虚拟机避免物理重启。
答案 4 :(得分:0)
我尝试了答案中的所有方法,包括CacheSet,但它们不适用于FindFirstFile / FindNextfile()。这是有用的:
通过网络扫描文件。扫描共享驱动器时,似乎Windows不会缓存文件夹,因此每次都很慢。
使任何算法变慢的最简单方法是插入对Sleep()的调用。这可以揭示多线程代码中的许多问题,这就是我真正想要做的事情。