在我的代码中,我有一个文件数据库httpcache.db
,我的应用程序在一个读/写文件i/o调用中将其读入内存并将其写回磁盘。我使用普通的fopen/fread来读/写它。我决定压缩它,看看缩小大小是否会导致整体速度加快。首先,我测量了读取httpcache.db
所需的加载时间,得到了350微秒的稳定时间。httpcache.db
文件大小为500KB。然后,我简单地将其压缩(httpcache.db.zip
大小变为24KB),并尝试测量读取压缩文件所需的时间。压缩文件需要90微秒。然而,根据我的测量,解压这个文件大约需要1000微秒(总共1090微秒对350微秒)。
然后我试着用lz4压缩器代替。压缩后的大小变为40KB。然而,用lz4解压我的原始httpcache.db只需要80微秒。这看起来像是一场胜利:在lz4压缩之前,90+80微秒vs350。为了确保一切正常,我进行了最后一次运行来验证数字,令我惊讶的是,加载压缩的40KB文件所需的时间与加载原始500KB未压缩文件所需的时间相同。我检查了所有的代码,没有发现任何问题:加载40KB或500KB的文件需要350-400微秒,而加载24KB的文件需要90微秒。唯一的区别(文件大小除外)是文件名/扩展名。我简单地将lz4压缩文件从httpcache.db重命名为httpcache.zip,令我惊讶的是,简单地更改文件扩展名突然将文件i/o“提升”了200%:加载40KB的httpcache.zip
文件将需要90微秒。
在尝试了不同的方法后,如果文件的扩展名是.db
或.bin
,我似乎会读得很慢;如果扩展名是.zip
、.txt
或根本没有扩展名,我就会读得很快。
显然,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);
}
}
使用QPC时钟实现timeMicro
。
我得到的一个示例运行的输出:
0:000 ... start
0:002 ../data/httpcache.db.zip load time: 97 micro
0:003 ../data/httpcache.db load time: 450 micro
发布于 2020-03-28 18:35:41
看起来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出现问题,这就是问题的解决方案。奇怪的是,文件扩展名可能会影响这一点。
https://stackoverflow.com/questions/60904950
复制