首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么在Windows上读取文件的速度取决于文件的扩展名?

为什么在Windows上读取文件的速度取决于文件的扩展名?
EN

Stack Overflow用户
提问于 2020-03-28 18:13:45
回答 1查看 66关注 0票数 0

在我的代码中,我有一个文件数据库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产生如此大的影响?

这是我运行来测量的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

我得到的一个示例运行的输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   0:000 ... start
   0:002 ../data/httpcache.db.zip load time: 97 micro
   0:003 ../data/httpcache.db load time: 450 micro
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-28 18:35:41

看起来windows defender才是罪魁祸首。即使我的所有工作都位于我在防病毒设置中添加到排除列表中的文件夹中,即使我试图将此httpcache.db添加到排除列表中,但在我尝试关闭实时保护之前,它仍然没有任何作用:

之后,文件的扩展名将不会影响文件io的速度:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   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出现问题,这就是问题的解决方案。奇怪的是,文件扩展名可能会影响这一点。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60904950

复制
相关文章
javascript 隐式转换_mysql隐式转换
简单数据类型(也称为原始类型):Undefined、Null、Boolean、Number、String 和 Symbol。ES6 中新增了一种 Symbol 。这种类型的对象永不相等,即始创建的时候传入相同的值,可以解决属性名冲突的问题,做为标记。 复杂数据类型叫 Object(对象)。Object 是一种无序名值对的集合。
全栈程序员站长
2022/11/07
1.6K0
javascript 隐式转换_mysql隐式转换
mysql 隐式类型转换_scala的隐式转换
在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引。下面分析两种隐式转换的情况
全栈程序员站长
2022/11/07
1.9K0
mysql 隐式类型转换_scala的隐式转换
sql的隐式转换_js强制转换和隐式转换
Oracle中对不同类型的处理具有显式类型转换(Explicit)和隐式类型转换(Implicit)两种方式,对于显式类型转换,我们是可控的,但是对于隐式类型转换,当然不建议使用, 因为很难控制,有不少缺点,但是我们很难避免碰到隐式类型转换,如果不了解隐式类型转换的规则,那么往往会改变我们SQL的执行计划,从而可能导致效率降低或其它问题。
全栈程序员站长
2022/11/07
3K0
C# 隐式转换_php隐式转换
预定义的隐式转换总会成功而且不会引发异常,适当合理的用户自定义隐式转换也可以展示出这些 特性。
全栈程序员站长
2022/09/27
1.4K0
mysql 隐式转换_js强制转换和隐式转换
什么鬼,明明查的是204027026112927603,为什么204027026112927605也出来了
全栈程序员站长
2022/11/07
4.9K0
mysql 隐式转换_js强制转换和隐式转换
JS隐式转换_隐式转换是什么
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/10
1.9K0
php隐式转换,隐式转换如何使用?总结隐式转换实例用法「建议收藏」
JavaScript的数据类型分为六种,分别为null,undefined,boolean,string,number,object。object是引用类型,其它的五种是基本类型或者是原始类型。我们可以用typeof方法打印来某个是属于哪个类型的。不同类型的变量比较要先转类型,叫做类型转换,类型转换也叫隐式转换。隐式转换通常发生在运算符加减乘除,等于,还有小于,大于等。。typeof ’11’ //string
全栈程序员站长
2022/11/10
1.7K0
php隐式转换,隐式转换如何使用?总结隐式转换实例用法「建议收藏」
spark隐式转换 toDf_隐式转换是什么
解决方案就是自己定义一个隐式转换函数,double2int。这个隐士函数的功能也需要是唯一的
全栈程序员站长
2022/11/10
1.1K0
spark隐式转换 toDf_隐式转换是什么
scala 隐式转换
Scala 中可以让函数库调用变得更加方便的隐式变换和隐式参数,以及如何通过它们来避免一些繁琐和显而易见的细节问题。 内容主要包括 implicits 的使用规则、隐含类型转换、转换被方法调用的对象等
全栈程序员站长
2022/11/10
1.1K0
关于隐式转换
昨天,一个读者向我提交了一个问题,请我就SQL server 隐式转换发表一些看法。当SQL server遇到一个不匹配类型的表达式的时候,它有两种选择。它使用隐式转换并能够执行或者转换错误而导致执行失败。在深入隐式转换之前,让我们假定错误的情形。
Leshami
2022/03/08
7690
scala隐式转换[通俗易懂]
在之前的章节中有使用到隐式转换:scala 使用jackson解析json成对象
全栈程序员站长
2022/11/08
7600
Oracle的隐式转换
都说Oracle存在NUMBER和VARCHAR2类型的隐式转换,严格意义上需要避免,但为何需要避免,从下面的实验进行验证。 1. 创建测试表和索引 create table tn (id number, name varchar2(1));
bisal
2019/01/29
9200
MySQL隐式转换
当运算符与不同类型的操作数一起使用时,将进行类型转换以使操作数兼容。某些转换是隐式发生的。 官方给的定义些许抽象,下面看例子。 有车辆表vehicle。
关忆北.
2023/10/11
1900
MySQL隐式转换
MySQL隐式类型注入与隐式转换
在MySQL中执行SQL查询时,如果SQL语句中字段的数据类型和表中对应字段的数据类型不一致时,MySQL查询优化器会将数据的类型进行隐式转换。
Petrochor
2022/06/07
1.3K0
MySQL隐式类型注入与隐式转换
Scala 【 14 隐式转换与隐式参数 】
​ Scala 的隐式转换,其实最核心的就是定义隐式转换函数,即 implicit conversion function 。
Lokinli
2023/03/09
8250
「  [学习记录] JS 类型转换 - 隐式转换  」
简单来说就是,在比较运算过程中,基本数据类型会隐式转换,复杂数据类型不能隐式转换,但会使用toString()转成字符串,然后再进行隐式转换
青益
2023/01/09
5.2K0
「  [学习记录] JS 类型转换 - 隐式转换  」
oracle隐式转换和显式转换_oracle显示游标和隐式
和其他的关系型数据库一样, oracle 中也能进行一些隐式的数据转换,这对我们写 SQL 语句有 非常 用,我们可以不必麻烦地手动转化很多类型的字符。虽然前面我们介绍了一些使用例如to_char,to_date的函数进行强制转换的方法,但是隐式转换也还是不错的。 Orac
全栈程序员站长
2022/11/10
1K0
Scala基础——隐式转换
Scala的隐式转换,其实最核心的就是定义隐式转换函数,即implicitconversion function。定义的隐式转换函数,只要在编写的程序内引入,就会被Scala自动使用。Scala会根据隐式转换函数的签名,在程序中使用到隐式转换函数接收的参数类型定义的对象时,会自动将其传入隐式转换函数,转换为另外一种类型的对象并返回。这就是“隐式转换”。 通常建议将隐式转换函数的名称命名为“one2one”的形式。 隐式转换函数与普通函数唯一的语法区别就是,要以implicit开头,而且最好要定义函数返回类型。
羊羽shine
2019/08/16
7270
JavaScript类型隐式转换
JavaScript 的数据类型之前已经讲过了,忘记的小伙伴出门左转,查看搞懂 JavaScript 的数据类型
闲花手札
2023/10/17
2130
JavaScript简单隐式转换
今天在帮后台写一个页面的时候,发现了一个问题,字符串的true或者false,怎么才能转换成布尔类型的?我毫不犹豫的用了Boolean,结果就是发现页面都显示的是true的效果。随后查了一下有没有方法转换,查到的居然都是去判断。
wade
2020/04/23
5800

相似问题

在后台运行时显示弹出窗口?

31

请求小米设备的运行时权限

14

弹出窗口启用

22

通过弹出窗口启用对辅助设备的访问

10

在后台运行时显示弹出窗口的权限

273
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文