This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]