This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
Really, really, poor IO performance!
- From: Steve Kargl <sgk at troutmask dot apl dot washington dot edu>
- To: fortran at gcc dot gnu dot org
- Date: Sun, 29 May 2005 19:12:06 -0700
- Subject: Really, really, poor IO performance!
Consider the following program:
program kl
integer i,j,k
integer, parameter :: m = 1000, n = 387
real x(m,n)
x = 1.e0
inquire(iolength=k) (x(i,1), i=1, m)
open(unit=1, file='foo.dat', access='direct', recl=k)
do j = 1, n
write(1,rec=j) (x(i,j), i=1, n)
end do
close(1)
end program kl
kargl[244] gfc41 -o z -static -O kl.f90
kargl[245] ls
kargl[246] rm foo.dat
kargl[247] time ./z
0.10 real 0.03 user 0.06 sys
kargl[248] time ./z
93.17 real 0.36 user 28.39 sys
kargl[249] time ./z
82.66 real 0.36 user 28.25 sys
kargl[250] rm foo.dat
kargl[251] time ./z
0.10 real 0.03 user 0.07 sys
Now, image if one's program has m = 1080 and n = 25000. Oh the
misery!
The suggest, but untested, fix is
Index: unix.c
===================================================================
RCS file: /cvs/gcc/gcc/libgfortran/io/unix.c,v
retrieving revision 1.26
diff -c -p -r1.26 unix.c
*** unix.c 17 May 2005 16:54:51 -0000 1.26
--- unix.c 30 May 2005 02:10:48 -0000
*************** regular_file (unit_flags *flags)
*** 1067,1075 ****
case STATUS_UNKNOWN:
case STATUS_SCRATCH:
- crflag = O_CREAT;
- break;
-
case STATUS_REPLACE:
crflag = O_CREAT | O_TRUNC;
break;
--- 1068,1073 ----
--
Steve