This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

Re: [patch, libgfortran] Bug 78549 - [7/8 Regression] Very slow formatted internal file output


On Mon, Nov 20, 2017 at 12:56 AM, Jerry DeLisle <jvdelisle@charter.net> wrote:
> Hi all,
>
> After the usual considerable digging around I determined that for the test case
> doing 1000000 writes to a string that we were allocating 1000000 newunit numbers
> and the associated unit structures on the unit treap. Consequently, at the end
> of the program, when all left open units are cleaned up and closed, a lot of
> time was being burned.  We did not benefit from the previously allocated unit
> structures saved on the treap that could be reused.
>
> IO operations on strings complete with st_read_done or st_write_done of the
> parent IO procedure.  To fix the problem, I simply declared newunit_alloc
> accessible to transfer.c and invoked it.
>
> Now unit numbers and their associated unit structures are reused as they should
> be and internal unit I/O is just a little bit better than on gfortran version 6.
>
> My test results with the test case in the PR are as follows. (I commented out
> the intermediate write to stdout for clarity)
>
> Patched trunk:
>
> $ gfc -static pr78549.f
> $ time ./a.out
>
> real    0m22.476s
> user    0m22.183s
> sys     0m0.180s
>
> And gfortran 6:
>
> $ gfc6 -static pr78549.f
> $ time ./a.out
>
> real    0m22.790s
> user    0m22.633s
> sys     0m0.011s
>
> Unpatched gfortran 7:
>
> $ gfc7 -static pr78549.f
> $ time ./a.out
>
> real    0m29.915s
> user    0m28.750s
> sys     0m0.971s
>
>
> Regression tested on x86-64-linux.
>
> I will commit to trunk in a day and back port to 7 in a few more days if no
> objections.  The patch is simple.
>
> Regards,
>
> Jerry
>
> 2017-11-19  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
>
>         PR libgfortran/78549
>         * io/io.h (newunit_free): Add declaration. Clean some whitespace.
>         * io/transfer.c (st_read_done, st_write_done): Call newunit_free.
>         * io/unit.c (newunit_free): Change type from static void to void.

In the patch:

 extern void finish_last_advance_record (gfc_unit *u);
-internal_proto (finish_last_advance_record);
+internal_proto(finish_last_advance_record);

 extern int unit_truncate (gfc_unit *, gfc_offset, st_parameter_common *);
-internal_proto (unit_truncate);
+internal_proto(unit_truncate);

 extern int newunit_alloc (void);
 internal_proto(newunit_alloc);

+extern void newunit_free (int);
+internal_proto (newunit_free);
+

Since you're fixing the whitespace for finish_last_advance_record and
unit_truncate, you might as well do it right for newunit_free from the
start.. :)

Otherwise Ok, thanks for the patch!



-- 
Janne Blomqvist


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