chuxf 发表于 2014-2-27 09:54 我也是用的windows系统,台式机,应该没有ssd。读写文件硬盘性能(包括缓存)非常重要,因此,不同机器比较意义不大。新文件还是旧文件原理上应该对读写影响不大,因为无非是一个从何处写的地址问题。当然操作系统是如何控制的可能也有差别。 |
流文件是二进制的,本身尺寸就要比文本方式小,输出量就少很多。 另外,内存里的数据是二进制的,直接二进制输出,少了中间的转换过程,速度自然快很多的。 这个问题还有几个已知的影响因素,例如: 硬盘配置(我有一个20G的SSD硬盘和一块常规硬盘,SSD速度可快0.5秒左右) 同时运行的其他应用程序(尤其是大量读写硬盘的程序) jason 是用 linux 跑的吧?我不甚了解,至少在windows 下,操作系统会有硬盘缓存,执行10000次write,可能执行到8000次的时候,第2000次写入才真正有效(仅举例)。 |
在我的机器上的运行结果为: 写文件耗时 : 8.37725258 写文件耗时 : 8.37725449 按流操作进行操作(access=“stream”),运行结果为: 写文件耗时 : 1.84081101 写文件耗时 : 1.82521200 两种情况下写新文件和旧文件速度都差不多,但流操作速度快很多,当然生成的文件体积也小很多。因此如果很在意文件读写速度,还是采用“流”方式较好。 |
chuxf 发表于 2014-2-26 22:23 原来如此,我早上遇到的是写已经有的文件比较慢,但是晚上试的时候发现新文件慢, |
我倒不觉得是因为文件里是否存在内容而引起的效率差别。 个人认为是硬盘缓存惹的祸。(这个取决于操作系统,乃至硬盘配置) 把你的代码修改如下: [Fortran] 纯文本查看 复制代码 program main implicit none real*16::x=1.0/3.0q0 real*16::y=1.0/5.0q0 integer i REAL*4 :: T1,T2 CALL TTIME(T1) open(unit=10,file='xx.dat') do i=1,1000000 write(10,*)x enddo CLOSE(10) CALL TTIME(T2) WRITE(*,*)'写文件耗时:',T2-T1 CALL TTIME(T1) open(unit=10,file='xx.dat') do i=1,1000000 write(10,*)y enddo CLOSE(10) CALL TTIME(T2) WRITE(*,*)'写文件耗时:',T2-T1 pause end SUBROUTINE TTIME(T) REAL(4) T,TA(2) T=ETIME(TA) END SUBROUTINE 运行结果,与你的代码差不多。这说明,先写已经存在的文件更慢,而后写新文件更快。 这说明效率与新旧文件无关,只与先后顺序有关。 |
捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )
GMT+8, 2024-11-27 06:07