有没有一种批处理命令或其他方法可以强制Windows缓存该文件?我正在尝试创建一个游戏预加载器,在启动游戏之前将某些游戏文件加载到缓存中。我能做到吗?
更新了int main代码:
int main(int argc, const char** argv)
{
if(argc >= 2) for(int i = 1; argv[i]; ++i) pf("C:\\Games\World_of_Tanks\res\packages\gui.pkg"[i]);
return 0;
}
ReadFile
或通过内存映射文件并触碰每一页来加载文件即可(实际上,由于分配粒度,每16页就足够了,但在理论上,您应该接触每一页)。内存映射更快且更易于缓存,因为您不需要分配额外的内存来保存数据(您不会用于任何有用的事情!)。操作系统将重用相同的物理内存用于缓存和进程可以看到的虚拟内存。#include <windows.h>
#include <cstdio>
void pf(const char* name)
{
HANDLE file = CreateFile(name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(file == INVALID_HANDLE_VALUE) { printf("couldn't open %s\n", name); return; };
unsigned int len = GetFileSize(file, 0);
HANDLE mapping = CreateFileMapping(file, 0, PAGE_READONLY, 0, 0, 0);
if(mapping == 0) { printf("couldn't map %s\n", name); return; }
const char* data = (const char*) MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0);
if(data)
{
printf("prefetching %s... ", name);
// need volatile or need to use result - compiler will otherwise optimize out whole loop
volatile unsigned int touch = 0;
for(unsigned int i = 0; i < len; i += 4096)
touch += data[i];
}
else
printf("couldn't create view of %s\n", name);
UnmapViewOfFile(data);
CloseHandle(mapping);
CloseHandle(file);
}
int main(int argc, const char** argv)
{
if(argc >= 2) for(int i = 1; argv[i]; ++i) pf(argv[i]);
return 0;
}
GetFileSize
而限制为4GiB,但如果您确实需要那么大的文件,这也很容易解决。volatile
相比,一个人可能想要返回或以其他方式消耗“result”,但无论哪种方式都可以(与磁盘访问相比,volatile
对性能没有真正可衡量的影响!)。
Measure-Command { Get-Childitem -path <your dir> -recurse | Get-FileHash -Algorithm MD5 | Out-Default }
Measure-Command
,为什么不呢?它只是输出所提供命令的总运行时间。虽然不是必需的,但它可以轻松回答“花了多长时间?”这个问题。这只是锦上添花,如下所示。Days : 0
Hours : 0
Minutes : 3
Seconds : 54
Milliseconds : 659
Ticks : 2346597665
TotalDays : 0.00271596951967593
TotalHours : 0.0651832684722222
TotalMinutes : 3.91099610833333
TotalSeconds : 234.6597665
TotalMilliseconds : 234659.7665
Get-Childitem
以-recurse
的方式操作给定目录中的所有内容。我选择了-Algorithm MD5
用于Get-FileHash
,因为它比其他SHA
哈希算法更快一些。我们实际上不需要更多的操作,只需强制读取文件并对磁盘上包含的所有数据进行一些操作。/dev/null
(Windows的等效操作),但所需时间比简单地对所有内容进行MD5哈希计算要长6倍以上。无法理解为什么会这样,但我希望通过不对文件内容进行计算来加快进程。但这条路行不通。