This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
Re: [fortran-dev, patch] Parsed format data caching
- From: Jerry DeLisle <jvdelisle at verizon dot net>
- To: Fortran List <fortran at gcc dot gnu dot org>
- Cc: gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Sat, 28 Mar 2009 18:20:21 -0700
- Subject: Re: [fortran-dev, patch] Parsed format data caching
- References: <49CECC5D.3060601@verizon.net>
Jerry DeLisle wrote:
Hi folks,
This patch uses the simplest of hashing functions to hash a format
string and save a pointer to the parsed format data and its tokenized
fnode tree.
This saves repeated re-parsing of format strings for every instance of a
formatted I/O operation, especially inside loops.
The method is probabilistic, meaning it relies on a good chance you
won't clobber previously saved data. If there is a collision, the
previously saved data is discarded and replaced by the new. The hash
table size is fixed with 16 entries.
On some test cases I have seen about 18% speed up in formatted I/O.
Regression tested on x86-64-linux-gnu.
OK for commit to fortran-dev branch? If anyone is curious, the patch
will apply on 4.4 and 4.5 with some fuzz.
Regards,
Jerry
ChangeLog I forgot:
2009-03-28 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libfortran/37754
* io/io.h (format_hash_entry): New structure for hash table.
(format_hash_table): The hash table itself.
(free_format_data): Revise function prototype.
(free_format_hash_table, init_format_hash,
free_format_hash): New function prototypes.
* io/unit.c (close_unit_1): Use free_format_hash_table.
* io/transfer.c (st_read_done, st_write_done): Free format data if
internal unit.
* io/format.c (free_format_hash_table): New function that frees any
memory allocated previously for cached format data.
(reset_node): New static helper function to reset the format counters
for a format node.
(reset_fnode_counters): New static function recursively calls reset_node
to traverse the fnode tree.
(format_hash): New simple hash function based on XOR, probabalistic,
tosses collisions.
(save_parsed_format): New static function to save the parsed format
data to use again.
(find_parsed_format): New static function searches the hash table
looking for a match.
(free_format_data): Revised to accept pointer to format data rather than
the dtp pointer so that the function can be used in more places.
(format_lex): Editorial.
(parse_format_list): Set flag used to determine of format data hashing
is to be used. Internal units are not persistent enough for this.
(revert): Move to ne location in file.
(parse_format): Use new functions to look for previously parsed
format strings and use them rather than re-parse. If not found, saves
the parsed format data for later use.