Optimization in load_generic_interfaces()
Thomas Koenig
tkoenig@netcologne.de
Wed Aug 22 15:43:00 GMT 2018
Hi Andrew,
[please also copy in gcc-patches for patches]
> I'm continuing to look for optimizations to improve compile times for files
> which USE large numbers of modules containing large numbers of symbols.
>
> When the number of symbols becomes very large, find_symbol() becomes a slow-
> point, because it can't use the structure of the balanced binary tree to
> rapidly search the symtree, so just has to go through the whole tree until it
> finds (or doesn't find) the symbol.
>
> I don't see a simple way to improve the speed of this function, but there
> seems to be a simple change in load_generic_interfaces() which gives
> significant speed up:
>
> Index: gcc/fortran/module.c
> ===================================================================
> --- gcc/fortran/module.c (revision 263667)
> +++ gcc/fortran/module.c (working copy)
> @@ -4559,9 +4559,6 @@ load_generic_interfaces (void)
> /* Decide if we need to load this one or not. */
> p = find_use_name_n (name, &i, false);
>
> - st = find_symbol (gfc_current_ns->sym_root,
> - name, module_name, 1);
> -
> if (!p || gfc_find_symbol (p, NULL, 0, &sym))
> {
> /* Skip the specific names for these cases. */
> @@ -4570,6 +4567,9 @@ load_generic_interfaces (void)
> continue;
> }
>
> + st = find_symbol (gfc_current_ns->sym_root,
> + name, module_name, 1);
> +
> /* If the symbol exists already and is being USEd without being
> in an ONLY clause, do not load a new symtree(11.3.2). */
> if (!only_flag && st)
>
>
> This just delays the call to find_symbol() until after the first test of whether
> the symbol needs to be loaded - if that test fails then find_symbol() is never
> called.
>
> This has no significant effect on compile time for files which import small
> numbers of symbols. But for cases where the number is large I find that the
> compile time can be reduced by up to 40% in the cases I've tried.
>
> The change passes all regression tests cleanly.
The patch is OK for trunk.
Thanks!
Regards
Thomas
More information about the Gcc-patches
mailing list