Fortran Coder

查看: 14432|回复: 5
打印 上一主题 下一主题

[文件读写] 关于文件读写速度的问题

[复制链接]

135

帖子

15

主题

0

精华

版主

F 币
1159 元
贡献
637 点

爱心勋章管理勋章

跳转到指定楼层
楼主
发表于 2014-2-26 21:29:29 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 珊瑚虫 于 2014-2-26 21:51 编辑

今天运行一个程序,发现如果一个文件是已经存在的文件,要给里面写东西,要比这个文件原来不存在写东西要快,各位同仁有没有遇到过类似的问题。
[Fortran] 纯文本查看 复制代码
01    program main
02    implicit none
03    real*16::x=1.0/3.0q0
04    real*16::y=1.0/5.0q0
05    integer i
06    REAL*4 :: T1,T2
07    CALL TTIME(T1)
08    open(unit=10,file='xx.dat')
09    do i=1,1000000
10    write(10,*)x
11    enddo
12    CLOSE(10)
13    CALL TTIME(T2)
14    WRITE(*,*)'写文件耗时:',T2-T1
15    CALL TTIME(T1)
16    open(unit=10,file='xx.dat')
17    do i=1,1000000
18    write(10,*)y
19    enddo 
20    CLOSE(10)
21    CALL TTIME(T2)
22    WRITE(*,*)'写文件耗时:',T2-T1
23    pause
24    end
25     
26SUBROUTINE TTIME(T)
27REAL(4) T,TA(2)
28T=ETIME(TA)
29    END SUBROUTINE





未命名.JPG (24.24 KB, 下载次数: 992)

未命名.JPG
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

69

帖子

7

主题

0

精华

专家

F 币
320 元
贡献
224 点
6#
发表于 2014-2-27 11:23:30 | 只看该作者
chuxf 发表于 2014-2-27 09:54
流文件是二进制的,本身尺寸就要比文本方式小,输出量就少很多。

另外,内存里的数据是二进制的,直接二进 ...

我也是用的windows系统,台式机,应该没有ssd。读写文件硬盘性能(包括缓存)非常重要,因此,不同机器比较意义不大。新文件还是旧文件原理上应该对读写影响不大,因为无非是一个从何处写的地址问题。当然操作系统是如何控制的可能也有差别。

742

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
726 元
贡献
371 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

5#
发表于 2014-2-27 09:54:34 | 只看该作者
流文件是二进制的,本身尺寸就要比文本方式小,输出量就少很多。

另外,内存里的数据是二进制的,直接二进制输出,少了中间的转换过程,速度自然快很多的。

这个问题还有几个已知的影响因素,例如:
硬盘配置(我有一个20G的SSD硬盘和一块常规硬盘,SSD速度可快0.5秒左右)
同时运行的其他应用程序(尤其是大量读写硬盘的程序)

jason 是用 linux 跑的吧?我不甚了解,至少在windows 下,操作系统会有硬盘缓存,执行10000次write,可能执行到8000次的时候,第2000次写入才真正有效(仅举例)。

69

帖子

7

主题

0

精华

专家

F 币
320 元
贡献
224 点
地板
发表于 2014-2-27 08:24:30 | 只看该作者
在我的机器上的运行结果为:
写文件耗时 :   8.37725258   
写文件耗时 :   8.37725449

按流操作进行操作(access=“stream”),运行结果为:
写文件耗时 :   1.84081101   
写文件耗时 :   1.82521200

两种情况下写新文件和旧文件速度都差不多,但流操作速度快很多,当然生成的文件体积也小很多。因此如果很在意文件读写速度,还是采用“流”方式较好。

   

135

帖子

15

主题

0

精华

版主

F 币
1159 元
贡献
637 点

爱心勋章管理勋章

板凳
 楼主| 发表于 2014-2-26 22:31:13 | 只看该作者
chuxf 发表于 2014-2-26 22:23
我倒不觉得是因为文件里是否存在内容而引起的效率差别。
个人认为是硬盘缓存惹的祸。(这个取决于操作系统 ...

原来如此,我早上遇到的是写已经有的文件比较慢,但是晚上试的时候发现新文件慢,

742

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
726 元
贡献
371 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2014-2-26 22:23:06 | 只看该作者

我倒不觉得是因为文件里是否存在内容而引起的效率差别。
个人认为是硬盘缓存惹的祸。(这个取决于操作系统,乃至硬盘配置)

把你的代码修改如下:
[Fortran] 纯文本查看 复制代码
01     program main
02     implicit none
03     real*16::x=1.0/3.0q0
04     real*16::y=1.0/5.0q0
05     integer i
06     REAL*4 :: T1,T2
07     CALL TTIME(T1)
08     open(unit=10,file='x:\xx.dat',status='old') !// 旧文件
09     do i=1,1000000
10     write(10,*)x
11     enddo
12     CLOSE(10,status='delete') !// 删除旧文件
13CALL TTIME(T2)
14     WRITE(*,*)'写文件耗时:',T2-T1
15     CALL TTIME(T1)
16     open(unit=10,file='x:\xx.dat',status='new') !// 新建文件
17     do i=1,1000000
18     write(10,*)y
19     enddo 
20     CLOSE(10)
21     CALL TTIME(T2)
22     WRITE(*,*)'写文件耗时:',T2-T1
23     pause
24     end
25      
26SUBROUTINE TTIME(T)
27REAL(4) T,TA(2)
28T=ETIME(TA)
29     END SUBROUTINE


运行结果,与你的代码差不多。这说明,先写已经存在的文件更慢,而后写新文件更快。



这说明效率与新旧文件无关,只与先后顺序有关。

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-4-27 13:45

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表