社区
C语言
帖子详情
linux与windows频繁打开和关闭文件性能差很远吗?
Hello_World_01
2012-06-14 07:01:45
我平时在linux环境上做开发时很习惯封装类似如下的文件追加函数,而且性能很高。
int appendfike(...)
{
fopen...
fwrite...
fclose...
...
}
按上面代码移植到vc6或vc2008时发现性能好低呀,追加上万条记录就感觉到很慢了。
但是我改成只打开一次,而写N条记录这样性能却很高。
请问是文件系统不同的原因造成的吗?还是其它原因呀?
...全文
833
15
打赏
收藏
linux与windows频繁打开和关闭文件性能差很远吗?
我平时在linux环境上做开发时很习惯封装类似如下的文件追加函数,而且性能很高。 int appendfike(...) { fopen... fwrite... fclose... ... } 按上面代码移植到vc6或vc2008时发现性能好低呀,追加上万条记录就感觉到很慢了。 但是我改成只打开一次,而写N条记录这样性能却很高。 请问是文件系统不同的原因造成的吗?还是其它原因呀?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
cpp618
2014-05-22
打赏
举报
回复
如果,把FILE留下来,那要什么时候关闭呢,假如文件时日志文件?
luciferisnotsatan
2012-06-19
打赏
举报
回复
[Quote=引用 3 楼 的回复:]
你这封装的也太烂了,写一次打开关闭一次?敢不敢把FILE打开就留下来重复用?
[/Quote]
+1
mars_man
2012-06-19
打赏
举报
回复
这就好像所有农民都不去商店买东西了,都各自自己去批发市场买。比起商店进货再销售的方案,不知道浪费多少资源。
iaccepted
2012-06-15
打赏
举报
回复
这种封装真太差了,即使在linux这样频繁的打开关闭文件(上万次),先不说效率问题,起码文件本身就很容易坏掉而无法打开。
在linux上也从来不这样写,而是一次打开尽可能完成一次读写操作。
Hello_World_01
2012-06-15
打赏
举报
回复
谢谢大家回复
我不了解_commit,能详细说一下吗?
rendao0563
2012-06-15
打赏
举报
回复
千把块就搞定了 你懂的.
pathuang68
2012-06-15
打赏
举报
回复
先将要写入的数据放到一块内存中,积累到了一定数量的时候,一次写入。几乎所有的数据库也都是这么干的,就是在commit的时候,数据才会真正写入到数据库文件中,否则都是在内存里面。在未commit之前,自己虽然可以看到数据表的变化,但是其它的用户是看不到的。
曾经用sqlite3在android手机上做过一个实验,如果每插入一条记录就commit一次(类似楼主的做法),其性能要比插入300条记录,commit一次差好几十倍。
不管是*nix还是windows,楼主的那种做法,效率都不会高,硬盘也会受不了的。
Hello_World_01
2012-06-15
打赏
举报
回复
大家还有什么补充的答案吗?
xunxun
2012-06-14
打赏
举报
回复
[Quote=引用 5 楼 的回复:]
引用 4 楼 的回复:
这个和_commit有关
你如果了解GCC不同平台的实现就知道了
Linux都没这个
有道理,用Windows就几乎感觉不到延迟写和缓存的存在,比如控制台IO,好像永远是立即回显的
但实际上应该是有缓存的,因为真要禁止了缓存会更慢,你知道这是为什么么
[/Quote]
我也不是很清楚
我知道这个是以前我发现的GCC在Windows平台性能大衰退的一个io严重bug
debug看了下,_commit这一块儿正好在Win32代码下
后来把这一块儿重写了,用了WriteFile的相关形式
当时查得资料可以参见
http://msdn.microsoft.com/en-us/library/aa364218%28v=VS.85%29.aspx
jackyjkchen
2012-06-14
打赏
举报
回复
[Quote=引用 4 楼 的回复:]
这个和_commit有关
你如果了解GCC不同平台的实现就知道了
Linux都没这个
[/Quote]
有道理,用Windows就几乎感觉不到延迟写和缓存的存在,比如控制台IO,好像永远是立即回显的
但实际上应该是有缓存的,因为真要禁止了缓存会更慢,你知道这是为什么么
xunxun
2012-06-14
打赏
举报
回复
这个和_commit有关
你如果了解GCC不同平台的实现就知道了
Linux都没这个
qq120848369
2012-06-14
打赏
举报
回复
你这封装的也太烂了,写一次打开关闭一次?敢不敢把FILE打开就留下来重复用?
jackyjkchen
2012-06-14
打赏
举报
回复
有一点是确定的,Windows涉及创建内核资源的API函数(会返回内核对象HANDLE的函数,如fopen内部调用的CreateFile)做的事情比linux系统调用多,速度也慢,这时候尽量减少这种函数的调用是Windows下编程的原则
jackyjkchen
2012-06-14
打赏
举报
回复
没错,windows为了通用性和可靠性做了许多的妥协(这就是为什么Windows不挑机器,任何PC运行效果都差不多,Linux却对机器挑三拣四,不光是驱动的问题),而且架构的不同导致看上去类似的东西windows的调用层数会更深,做的事情会更多
另一个典型例子就是有人喜欢拿linux的fork和windows的CreateProcess作比较得出linux创建进程比windows快几十倍的结论……去看看Windows Internals,CreateProcess做了多少事情,别说fork了,fork+exec都没CreateProcess做的事多
入门学习
Linux
常用必会60个命令实例详解doc/txt
这是因为
Linux
和许多版本的Unix一样,提供了虚拟控制台的访问方式,允许用户在同一时间从控制台(系统的控制台是与系统直接相连的监视器和键盘)进行多次登录。每个虚拟控制台可以看作是一个独立的工作站,工作台...
Linux
Windows
读写
频繁
吗,关于
Windows
文件
读写(提高读写速度)
这几天在研究怎么才能加快
windows
文件
读写速度,搜了很多文章,MSDN也看了不少。稍微给大家分享一下。限制
windows
文件
读写速度的瓶颈其实最终还是来源于我们硬盘的固有特性,磁盘本身的转速和硬盘的串行化工作机制。...
【好物推荐】SecureCRT,在
linux
与
windows
本地互传
文件
SecureCRT与SSHClient不同的就是SecureCRT没有图形化的
文件
传输工具,不过也不影响,用命令来实现的话,其实会方便快捷很多。
Linux
文件
IO基础
一个进程可以
打开
多个
文件
,但是在
Linux
系统中,一个进程可以
打开
的
文件
数是有限制,并不是可以无限制
打开
很多的
文件
,大家想一想便可以知道,
打开
的
文件
是需要占用内存资源的,
文件
越大、
打开
的
文件
越多那占用的...
[MongoDB] 认识MongoDB以及在
Windows
和
Linux
上安装MongoDB
安装过程涉及创建数据存储目录和配置
文件
,支持
Windows
和
Linux
系统。连接方式包括命令行工具和图形界面工具,服务管理提供快速
关闭
和标准
关闭
两种方式。与传统关系型数据库相比,MongoDB的文档模型更灵活,但空间...
C语言
70,037
社区成员
243,243
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章