[英]Why speed of reading a file on Windows depends on file's extension?
在我的代码中,我有一个文件数据库httpcache.db
,我的应用程序将它读入内存并在单个读/写 FILE i/o api 调用中将其写回磁盘。 我使用普通的 fopen/fread 读/写它。 我决定压缩它,看看减小尺寸是否会导致整体加速。 起初,我测量了读取httpcache.db
加载时间,我得到了 350 微秒的相当一致的时间。 httpcache.db
文件大小为 500KB。 然后我简单地压缩它( httpcache.db.zip
大小变成了 24KB)并尝试测量读取压缩文件所需的时间。 压缩文件需要 90 微秒。 但是,根据我的测量,解压缩此文件大约需要 1000 微秒(总计为 1090 微与 350 微)。
然后我尝试改用lz4压缩器。 压缩后的大小变成了 40KB。 但是,使用 lz4,解压缩我原来的 httpcache.db 只需要 80 微秒。 它看起来像是一场胜利:90+80 微秒与 lz4 压缩前的 350 微秒。 为了确保一切正常,我进行了最后一次运行以验证数字,令我惊讶的是,加载压缩的 40KB 文件所需的时间与加载原始 500KB 未压缩文件所需的时间相同。 我检查了所有内容,但没有发现我的代码有问题:不知何故加载 40KB 或 500KB 文件需要 350-400 微秒,而 24KB 文件需要 90 微秒。唯一的区别(文件大小除外)是文件名/扩展名。 我只是将 lz4 压缩文件从 httpcache.db 重命名为 httpcache.zip,令我惊讶的是,只是将文件扩展名突然“提升”了 200% 的文件 i/o:加载 40KB httpcache.zip
文件将按预期花费 90 微秒。
在尝试了不同的事情之后,如果文件的扩展名是.db
或.bin
,我似乎会读得很慢,如果扩展名是.zip
、 .txt
或根本没有扩展名,那么快速 io 。
显然,Windows 会根据文件扩展名以某种方式弄乱文件 io(我使用在 2020 macbook pro 16 上的 bootcamp 中运行的最新 Win10 pro)。 我为文件所在的文件夹禁用了防病毒软件,但仍然得到相同的结果。 任何想法发生了什么以及为什么文件的扩展名如此影响文件io?
这是我运行以测量的代码:
int main()
{
std::string fdataZip, fdata;
{
static const char dbName[] = "../data/httpcache.db.zip"; // 24KB
auto t0 = timeMicro();
readFile(dbName, fdataZip);
auto t1 = timeMicro();
LOG("%s load time: %lld micro", dbName, t1 - t0);
}
{
static const char dbName[] = "../data/httpcache.db"; // 40 KB
auto t0 = timeMicro();
readFile(dbName, fdata);
auto t1 = timeMicro();
LOG("%s load time: %lld micro", dbName, t1 - t0);
}
}
和 readFile 是:
void readFile(const char* fileName, std::string& fileData)
{
fileData.clear();
if (FILE* fl = fopen(fileName, "rb"))
{
fseek(fl, 0, SEEK_END);
long length = ftell(fl);
fseek(fl, 0, SEEK_SET);
if (length > 0)
{
fileData.resize(length);
(void)fread(&fileData[0], 1, length, fl);
}
fclose(fl);
}
}
timeMicro
是使用QPC时钟实现的。
我得到的示例运行的输出:
0:000 ... start
0:002 ../data/httpcache.db.zip load time: 97 micro
0:003 ../data/httpcache.db load time: 450 micro
看起来Windows Defender 是罪魁祸首。 即使我的所有工作都位于我在防病毒设置中添加到排除列表的文件夹中,并且即使我尝试将此httpcache.db
添加到排除中,它仍然没有任何区别,直到我尝试关闭实时保护:
之后,文件的扩展名不会影响文件 io 速度:
0:000 ... start
0:002 ../data/httpcache.db.zip load time: 89 micro
0:002 ../data/httpcache.db load time: 97 micro
在我的情况下,将我的文件重命名为httpcache
可以避免 windows 的 AV 问题,这是问题的解决方案。 文件扩展名可能会影响它,这有点奇怪。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.