Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Slow execution on big repositories under Cygwin #130

Open
Lucas-C opened this issue Feb 11, 2020 · 8 comments
Open

Slow execution on big repositories under Cygwin #130

Lucas-C opened this issue Feb 11, 2020 · 8 comments

Comments

@Lucas-C
Copy link

Lucas-C commented Feb 11, 2020

Hi !

I like your tool very much :)
I use it on 2 projects at work:

Sadly, it has become very slow to generate my changelog.

There are some commands to give you and idea of the situation (taken from a previous issue on the same subject: #7 ):

# time gitchangelog
real    3m26,777s
user    0m14,247s
sys     2m25,882s      

# time git log --oneline | wc -l
1315
real    0m0,693s
user    0m0,123s
sys     0m0,498s

# time git rev-parse $(git log --format=%H | tail -n 1)..HEAD
e507068883beea9b53cf55d84323aa37d0ff1f53
^18b3b3aaa26de3bfe6cbcd8bb0ec761ec2e851de
real    0m0,561s
user    0m0,061s
sys     0m0,466s

I use mustache as output_engine

@vaab
Copy link
Owner

vaab commented Feb 11, 2020

Hi, thanks for your report. I see that you've used gitchangelog thoroughly and are using incremental generation. I get few feedback, and your report is coming at a right time : I have a new experimental version of gitchangelog that needed some extensive performance/functionality testing.

Performance is important for me, and it really seems that there is room for improvements on this topic.

On hesperides project, you are using incremental changelog and when running gitchangelog with a fresh checkout (on commit aaac5e6), I get 2s run, and the expected file gets changed as I feel it should. I'm using gitchangelog 3.0.4.

I guess that you wanted a full changelog generation ? Can you tell me more how to reproduce your huge times at running gitchangelog. The best would be a small bash script.

@vaab
Copy link
Owner

vaab commented Feb 11, 2020

Please note, that cloning both of your git repositories and changing the provided .gitchangelog.rc by resetting your output to stdout, and commenting out rev to display all commits, running gitchangelog will display the full templated changelog on stdout in about 3s on my computer.

I can confirm this on both python 2.7.8 and python 3.7.1. Note that I'm running python on linux on a 2014 laptop computer.

@Lucas-C
Copy link
Author

Lucas-C commented Feb 11, 2020

I am using gitchangelog 3.0.4 under Cygwin with Python 3.7.4 and git 2.21.0 (both installed through Cygwin)

I played a little bit with the code, and it seems that GitRepos.log takes in average 0.2s to executes on my machine. And the 20 first lines of versions_data_iter take 10s to execute.

I wonder if maybe the issue is that gitchangelog starts a lot of shell processes, which may be time-expensive on my system

@vaab
Copy link
Owner

vaab commented Feb 12, 2020

Running a Windows 7 VM under Virtualbox, on hesperides clone, output redirected to stdout and all revisions selected, gitchangelog under Cygwin_NT-6.1 is taking 15s... which is already way to much but still orders of magnitude faster than your install (you mentionned 3mn) taking into account that it is a windows VM with 1cpu and 768M of RAM.

Have you gone down the tracks along abnormal cygwin performance ?

@vaab vaab changed the title Slow execution on big repositories Slow execution on big repositories under Cygwin Feb 12, 2020
@Lucas-C
Copy link
Author

Lucas-C commented Feb 12, 2020

Probably :(

Another test I just made, using cProfile:

# python3 -m cProfile /home/lucas_cimon/.local/lib/python3.7/site-packages/gitchangelog/gitchangelog.py
         448106 function calls (445026 primitive calls) in 54.619 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.432    0.432 .gitchangelog.rc:9(<module>)
    58/54    0.000    0.000    0.026    0.000 <frozen importlib._bootstrap>:1009(_handle_fromlist)
       41    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:103(release)
       35    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:143(__init__)
       35    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap>:147(__enter__)
       35    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:151(__exit__)
       41    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap>:157(_get_module_lock)
       35    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:176(cb)
        6    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:194(_lock_unlock_module)
     39/8    0.000    0.000    0.166    0.021 <frozen importlib._bootstrap>:211(_call_with_frames_removed)
      478    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:222(_verbose_message)
       34    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:307(__init__)
       34    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:311(__enter__)
       34    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:318(__exit__)
      136    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:321(<genexpr>)
       30    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:35(_new_module)
       35    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:369(__init__)
       64    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap>:403(cached)
       34    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:416(parent)
       34    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:424(has_location)
       34    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap>:504(_init_module_attrs)
       34    0.000    0.000    0.010    0.000 <frozen importlib._bootstrap>:576(module_from_spec)
       35    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:58(__init__)
     34/8    0.000    0.000    0.208    0.026 <frozen importlib._bootstrap>:663(_load_unlocked)
       35    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:719(find_spec)
       41    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:78(acquire)
       35    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:792(find_spec)
      105    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:855(__enter__)
      105    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap>:859(__exit__)
       35    0.000    0.000    0.016    0.000 <frozen importlib._bootstrap>:882(_find_spec)
     35/9    0.000    0.000    0.213    0.024 <frozen importlib._bootstrap>:948(_find_and_load_unlocked)
     35/9    0.000    0.000    0.213    0.024 <frozen importlib._bootstrap>:978(_find_and_load)
        4    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:1029(__init__)
        4    0.000    0.000    0.008    0.002 <frozen importlib._bootstrap_external>:1040(create_module)
        4    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:1048(exec_module)
        4    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:1190(_path_hooks)
      107    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:1203(_path_importer_cache)
       35    0.000    0.000    0.015    0.000 <frozen importlib._bootstrap_external>:1240(_get_spec)
       35    0.000    0.000    0.015    0.000 <frozen importlib._bootstrap_external>:1272(find_spec)
        4    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:1319(__init__)
       32    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:1325(<genexpr>)
       34    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:1351(_get_spec)
       86    0.001    0.000    0.013    0.000 <frozen importlib._bootstrap_external>:1356(find_spec)
        4    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:1404(_fill_cache)
        4    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:1433(<setcomp>)
        4    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:1445(path_hook_for_FileFinder)
       60    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:271(cache_from_source)
       86    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:36(_relax_case)
       34    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:369(_get_cached)
       30    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:401(_check_name_wrapper)
       30    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:438(_classify_pyc)
       30    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:471(_validate_timestamp_pyc)
       90    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:51(_r_long)
       30    0.000    0.000    0.004    0.000 <frozen importlib._bootstrap_external>:523(_compile_bytecode)
      446    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:56(_path_join)
       34    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:574(spec_from_file_location)
      446    0.000    0.000    0.001    0.000 <frozen importlib._bootstrap_external>:58(<listcomp>)
       60    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:62(_path_split)
       30    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:719(create_module)
     30/8    0.000    0.000    0.207    0.026 <frozen importlib._bootstrap_external>:722(exec_module)
      160    0.000    0.000    0.012    0.000 <frozen importlib._bootstrap_external>:74(_path_stat)
       30    0.001    0.000    0.178    0.006 <frozen importlib._bootstrap_external>:793(get_code)
       44    0.000    0.000    0.005    0.000 <frozen importlib._bootstrap_external>:84(_path_is_mode_type)
       30    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:884(__init__)
       30    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:909(get_filename)
       30    0.168    0.006    0.170    0.006 <frozen importlib._bootstrap_external>:914(get_data)
       40    0.000    0.000    0.004    0.000 <frozen importlib._bootstrap_external>:93(_path_isfile)
       30    0.000    0.000    0.002    0.000 <frozen importlib._bootstrap_external>:951(path_stats)
        4    0.000    0.000    0.000    0.000 <frozen importlib._bootstrap_external>:98(_path_isdir)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
     1092    0.001    0.000    0.002    0.000 <string>:1(__new__)
        1    0.000    0.000    0.000    0.000 __future__.py:48(<module>)
        1    0.000    0.000    0.000    0.000 __future__.py:80(_Feature)
       10    0.000    0.000    0.000    0.000 __future__.py:81(__init__)
        1    0.000    0.000    0.008    0.008 __init__.py:3(<module>)
        2    0.000    0.000    0.000    0.000 __init__.py:316(namedtuple)
       11    0.000    0.000    0.000    0.000 __init__.py:388(<genexpr>)
        3    0.000    0.000    0.000    0.000 __init__.py:43(normalize_encoding)
        1    0.000    0.000    0.094    0.094 __init__.py:5(<module>)
        6    0.000    0.000    0.000    0.000 _bootlocale.py:33(getpreferredencoding)
        1    0.000    0.000    0.000    0.000 _bootlocale.py:5(<module>)
      561    0.001    0.000    0.010    0.000 _collections_abc.py:657(get)
        1    0.000    0.000    0.000    0.000 _weakrefset.py:36(__init__)
        1    0.000    0.000    0.000    0.000 _weakrefset.py:81(add)
        1    0.000    0.000    0.000    0.000 abc.py:1(<module>)
        6    0.000    0.000    0.000    0.000 abc.py:125(__new__)
        4    0.000    0.000    0.000    0.000 abc.py:7(abstractmethod)
        1    0.000    0.000    0.000    0.000 argparse.py:1022(_HelpAction)
        1    0.000    0.000    0.000    0.000 argparse.py:1024(__init__)
        1    0.000    0.000    0.000    0.000 argparse.py:1041(_VersionAction)
        1    0.000    0.000    0.000    0.000 argparse.py:1043(__init__)
        1    0.000    0.000    0.000    0.000 argparse.py:105(_AttributeHolder)
        1    0.000    0.000    0.000    0.000 argparse.py:1067(_SubParsersAction)
        1    0.000    0.000    0.000    0.000 argparse.py:1069(_ChoicesPseudoAction)
        1    0.000    0.000    0.000    0.000 argparse.py:1165(FileType)
        1    0.000    0.000    0.000    0.000 argparse.py:1219(Namespace)
        1    0.000    0.000    0.000    0.000 argparse.py:1226(__init__)
        1    0.000    0.000    0.000    0.000 argparse.py:1239(_ActionsContainer)
        3    0.000    0.000    0.000    0.000 argparse.py:1241(__init__)
       34    0.000    0.000    0.000    0.000 argparse.py:1293(register)
        8    0.000    0.000    0.000    0.000 argparse.py:1297(_registry_get)
        4    0.000    0.000    0.000    0.000 argparse.py:1322(add_argument)
        2    0.000    0.000    0.000    0.000 argparse.py:1369(add_argument_group)
        4    0.000    0.000    0.000    0.000 argparse.py:1379(_add_action)
        1    0.000    0.000    0.000    0.000 argparse.py:1443(_get_positional_kwargs)
        3    0.000    0.000    0.000    0.000 argparse.py:1459(_get_optional_kwargs)
        4    0.000    0.000    0.000    0.000 argparse.py:1495(_pop_action_class)
        3    0.000    0.000    0.000    0.000 argparse.py:1499(_get_handler)
        4    0.000    0.000    0.000    0.000 argparse.py:1508(_check_conflict)
        1    0.000    0.000    0.000    0.000 argparse.py:152(HelpFormatter)
        1    0.000    0.000    0.000    0.000 argparse.py:1546(_ArgumentGroup)
        2    0.000    0.000    0.000    0.000 argparse.py:1548(__init__)
        4    0.000    0.000    0.000    0.000 argparse.py:1570(_add_action)
        1    0.000    0.000    0.000    0.000 argparse.py:1580(_MutuallyExclusiveGroup)
        4    0.000    0.000    0.000    0.000 argparse.py:159(__init__)
        1    0.000    0.000    0.000    0.000 argparse.py:1600(ArgumentParser)
        1    0.000    0.000    0.002    0.002 argparse.py:1619(__init__)
        4    0.000    0.000    0.000    0.000 argparse.py:1728(_add_action)
        1    0.000    0.000    0.000    0.000 argparse.py:1740(_get_positional_actions)
        1    0.000    0.000    0.000    0.000 argparse.py:1741(<listcomp>)
        1    0.000    0.000    0.000    0.000 argparse.py:1748(parse_args)
        1    0.000    0.000    0.000    0.000 argparse.py:1755(parse_known_args)
        1    0.000    0.000    0.000    0.000 argparse.py:1790(_parse_known_args)
        1    0.000    0.000    0.000    0.000 argparse.py:1837(take_action)
        1    0.000    0.000    0.000    0.000 argparse.py:1935(consume_positionals)
        1    0.000    0.000    0.000    0.000 argparse.py:202(_Section)
        4    0.000    0.000    0.000    0.000 argparse.py:204(__init__)
        1    0.000    0.000    0.000    0.000 argparse.py:2086(_match_arguments_partial)
        1    0.000    0.000    0.000    0.000 argparse.py:2092(<listcomp>)
        1    0.000    0.000    0.000    0.000 argparse.py:2096(<listcomp>)
        1    0.000    0.000    0.000    0.000 argparse.py:2205(_get_nargs_pattern)
        1    0.000    0.000    0.000    0.000 argparse.py:2338(_get_values)
        1    0.000    0.000    0.000    0.000 argparse.py:2420(_check_value)
        4    0.000    0.000    0.000    0.000 argparse.py:2460(_get_formatter)
        4    0.000    0.000    0.000    0.000 argparse.py:566(_metavar_formatter)
        4    0.000    0.000    0.000    0.000 argparse.py:575(format)
        4    0.000    0.000    0.000    0.000 argparse.py:582(_format_args)
        3    0.000    0.000    0.000    0.000 argparse.py:599(<listcomp>)
        1    0.000    0.000    0.000    0.000 argparse.py:62(<module>)
        1    0.000    0.000    0.000    0.000 argparse.py:650(RawDescriptionHelpFormatter)
        1    0.000    0.000    0.000    0.000 argparse.py:661(RawTextHelpFormatter)
        1    0.000    0.000    0.000    0.000 argparse.py:672(ArgumentDefaultsHelpFormatter)
        1    0.000    0.000    0.000    0.000 argparse.py:689(MetavarTypeHelpFormatter)
        1    0.000    0.000    0.000    0.000 argparse.py:722(ArgumentError)
        1    0.000    0.000    0.000    0.000 argparse.py:742(ArgumentTypeError)
        1    0.000    0.000    0.000    0.000 argparse.py:751(Action)
        4    0.000    0.000    0.000    0.000 argparse.py:802(__init__)
        1    0.000    0.000    0.000    0.000 argparse.py:842(_StoreAction)
        1    0.000    0.000    0.000    0.000 argparse.py:844(__init__)
        1    0.000    0.000    0.000    0.000 argparse.py:873(__call__)
        1    0.000    0.000    0.000    0.000 argparse.py:877(_StoreConstAction)
        1    0.000    0.000    0.000    0.000 argparse.py:879(__init__)
        1    0.000    0.000    0.000    0.000 argparse.py:900(_StoreTrueAction)
        1    0.000    0.000    0.000    0.000 argparse.py:902(__init__)
        1    0.000    0.000    0.000    0.000 argparse.py:917(_StoreFalseAction)
        1    0.000    0.000    0.000    0.000 argparse.py:934(_AppendAction)
        1    0.000    0.000    0.000    0.000 argparse.py:972(_AppendConstAction)
        1    0.000    0.000    0.000    0.000 argparse.py:999(_CountAction)
        1    0.000    0.000    0.000    0.000 codecs.py:186(__init__)
        4    0.000    0.000    0.000    0.000 codecs.py:260(__init__)
        4    0.000    0.000    0.000    0.000 codecs.py:309(__init__)
        4    0.000    0.000    0.000    0.000 codecs.py:319(decode)
        1    0.000    0.000    0.000    0.000 common.py:10(_get_string_types)
      398    0.000    0.000    0.001    0.000 common.py:24(is_string)
        1    0.000    0.000    0.000    0.000 common.py:56(MissingTags)
        1    0.000    0.000    0.000    0.000 common.py:6(<module>)
        1    0.000    0.000    0.000    0.000 common.py:64(PystacheError)
        1    0.000    0.000    0.000    0.000 common.py:69(TemplateNotFoundError)
        1    0.000    0.000    0.000    0.000 context.py:117(__init__)
        1    0.000    0.000    0.000    0.000 context.py:145(create)
        1    0.000    0.000    0.000    0.000 context.py:15(<module>)
      444    0.001    0.000    0.004    0.000 context.py:203(get)
      444    0.001    0.000    0.002    0.000 context.py:304(_get_simple)
      222    0.000    0.000    0.000    0.000 context.py:316(push)
        1    0.000    0.000    0.000    0.000 context.py:32(NotFound)
      221    0.000    0.000    0.000    0.000 context.py:323(pop)
      489    0.001    0.000    0.001    0.000 context.py:37(_get_value)
        1    0.000    0.000    0.000    0.000 context.py:79(KeyNotFoundError)
        1    0.000    0.000    0.000    0.000 context.py:94(ContextStack)
      546    0.003    0.000    0.088    0.000 contextlib.py:107(__enter__)
      546    0.006    0.000    0.129    0.000 contextlib.py:116(__exit__)
        1    0.000    0.000    0.000    0.000 contextlib.py:210(contextmanager)
      546    0.002    0.000    0.007    0.000 contextlib.py:237(helper)
      546    0.005    0.000    0.005    0.000 contextlib.py:81(__init__)
        1    0.000    0.000    0.000    0.000 datetime.py:1092(tzinfo)
        1    0.000    0.000    0.000    0.000 datetime.py:1162(time)
        2    0.000    0.000    0.000    0.000 datetime.py:1187(__new__)
        1    0.000    0.000    0.000    0.000 datetime.py:1509(datetime)
        3    0.000    0.000    0.000    0.000 datetime.py:1517(__new__)
        1    0.000    0.000    0.000    0.000 datetime.py:2136(timezone)
        3    0.000    0.000    0.000    0.000 datetime.py:2156(_create)
       35    0.000    0.000    0.000    0.000 datetime.py:379(_check_int_field)
        5    0.000    0.000    0.000    0.000 datetime.py:396(_check_date_fields)
        5    0.000    0.000    0.000    0.000 datetime.py:409(_check_time_fields)
        3    0.000    0.000    0.000    0.000 datetime.py:41(_days_before_year)
        5    0.000    0.000    0.000    0.000 datetime.py:426(_check_tzinfo_arg)
        1    0.000    0.000    0.000    0.000 datetime.py:454(timedelta)
        5    0.000    0.000    0.000    0.000 datetime.py:46(_days_in_month)
        9    0.000    0.000    0.000    0.000 datetime.py:473(__new__)
        1    0.000    0.000    0.006    0.006 datetime.py:5(<module>)
        1    0.000    0.000    0.000    0.000 datetime.py:646(__neg__)
        1    0.000    0.000    0.000    0.000 datetime.py:774(date)
        2    0.000    0.000    0.000    0.000 datetime.py:804(__new__)
        1    0.000    0.000    0.020    0.020 defaults.py:9(<module>)
        1    0.000    0.000    0.001    0.001 entities.py:1(<module>)
        2    0.000    0.000    0.000    0.000 enum.py:125(__prepare__)
        2    0.000    0.000    0.001    0.000 enum.py:135(__new__)
        2    0.000    0.000    0.000    0.000 enum.py:152(<dictcomp>)
        2    0.000    0.000    0.000    0.000 enum.py:177(<setcomp>)
       38    0.000    0.000    0.000    0.000 enum.py:18(_is_descriptor)
        6    0.000    0.000    0.000    0.000 enum.py:198(<genexpr>)
       42    0.000    0.000    0.000    0.000 enum.py:26(_is_dunder)
       50    0.000    0.000    0.001    0.000 enum.py:284(__call__)
        2    0.000    0.000    0.000    0.000 enum.py:335(__getattr__)
       42    0.000    0.000    0.000    0.000 enum.py:34(_is_sunder)
        2    0.000    0.000    0.000    0.000 enum.py:360(__members__)
       52    0.000    0.000    0.000    0.000 enum.py:376(__setattr__)
        2    0.000    0.000    0.001    0.000 enum.py:389(_create_)
        6    0.000    0.000    0.000    0.000 enum.py:442(_get_mixins_)
        6    0.000    0.000    0.000    0.000 enum.py:453(_find_data_type)
        2    0.000    0.000    0.000    0.000 enum.py:474(_find_new_)
       48    0.000    0.000    0.000    0.000 enum.py:526(__new__)
        8    0.000    0.000    0.000    0.000 enum.py:628(value)
        2    0.000    0.000    0.001    0.001 enum.py:633(_convert)
        2    0.000    0.000    0.000    0.000 enum.py:64(__init__)
        2    0.000    0.000    0.000    0.000 enum.py:654(<listcomp>)
       38    0.000    0.000    0.000    0.000 enum.py:659(<lambda>)
       42    0.000    0.000    0.000    0.000 enum.py:70(__setitem__)
       24    0.000    0.000    0.000    0.000 enum.py:836(__and__)
        1    0.000    0.000    0.000    0.000 fnmatch.py:11(<module>)
        6    0.000    0.000    0.000    0.000 functools.py:37(update_wrapper)
        1    0.000    0.000    0.000    0.000 functools.py:458(lru_cache)
        1    0.000    0.000    0.000    0.000 functools.py:492(decorating_function)
        5    0.000    0.000    0.000    0.000 functools.py:67(wraps)
       15    0.000    0.000    0.001    0.000 genericpath.py:16(exists)
        3    0.000    0.000    0.000    0.000 genericpath.py:27(isfile)
        6    0.000    0.000    0.000    0.000 gettext.py:211(_expand_lang)
        3    0.000    0.000    0.001    0.000 gettext.py:474(find)
        3    0.000    0.000    0.001    0.000 gettext.py:514(translation)
        3    0.000    0.000    0.001    0.000 gettext.py:585(dgettext)
        3    0.000    0.000    0.001    0.000 gettext.py:624(gettext)
        3    0.000    0.000    0.000    0.000 gitchangelog.py:1064(__init__)
        3    0.000    0.000    0.201    0.067 gitchangelog.py:1067(__getattr__)
        3    0.000    0.000    0.201    0.067 gitchangelog.py:1077(get)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:1087(GitCmd)
      546    0.002    0.000    0.003    0.000 gitchangelog.py:1089(__getattr__)
      546    0.008    0.000   48.002    0.088 gitchangelog.py:1092(dir_swrap)
      546    0.007    0.000   48.011    0.088 gitchangelog.py:1096(method)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:1118(GitRepos)
        2    0.000    0.000    0.749    0.375 gitchangelog.py:1120(__init__)
      320    0.001    0.000    0.003    0.000 gitchangelog.py:1167(commit)
      546    0.002    0.000    0.002    0.000 gitchangelog.py:1170(git)
        3    0.000    0.000    0.000    0.000 gitchangelog.py:1174(config)
        1    0.000    0.000    6.747    6.747 gitchangelog.py:1178(tags)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:1193(<listcomp>)
       87    0.001    0.000    6.613    0.076 gitchangelog.py:1194(<lambda>)
      231    0.017    0.000   14.280    0.062 gitchangelog.py:1196(log)
      143    0.002    0.000    0.005    0.000 gitchangelog.py:1222(mk_commit)
      231    0.002    0.000    1.165    0.005 gitchangelog.py:1234(<listcomp>)
      143    0.002    0.000    0.010    0.000 gitchangelog.py:1244(first_matching)
        1    0.000    0.000    0.428    0.428 gitchangelog.py:1253(ensure_template_file_exists)
        1    0.000    0.000    0.432    0.432 gitchangelog.py:1357(mustache)
       47    0.001    0.000   36.285    0.772 gitchangelog.py:1368(stuffed_versions)
        1    0.000    0.000   36.302   36.302 gitchangelog.py:1386(renderer)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:1485(FileRegexSubst)
        1    0.000    0.000    0.063    0.063 gitchangelog.py:1490(_wrapped)
       47    0.010    0.000   53.212    1.132 gitchangelog.py:1508(versions_data_iter)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:1543(<listcomp>)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:1549(<listcomp>)
        1    0.000    0.000    0.001    0.001 gitchangelog.py:1554(<listcomp>)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:1573(<listcomp>)
      143    0.000    0.000    0.000    0.000 gitchangelog.py:1599(<genexpr>)
       88    0.000    0.000    0.000    0.000 gitchangelog.py:1618(<listcomp>)
        1    0.000    0.000   53.232   53.232 gitchangelog.py:1626(changelog)
        2    0.000    0.000    0.000    0.000 gitchangelog.py:1677(obsolete_option_manager)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:1681(obsolete_replace_regexps)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:1696(obsolete_body_split_regexp)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:1709(manage_obsolete_options)
        1    0.000    0.000    0.009    0.009 gitchangelog.py:1718(parse_cmd_line)
        3    0.000    0.000    0.000    0.000 gitchangelog.py:1758(<lambda>)
        1    0.000    0.000    0.142    0.142 gitchangelog.py:1761(get_revision)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:1772(<listcomp>)
        1    0.000    0.000    0.096    0.096 gitchangelog.py:1794(get_log_encoding)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:1814(Config)
        5    0.000    0.000    0.000    0.000 gitchangelog.py:1816(__getitem__)
        1    0.000    0.000   54.413   54.413 gitchangelog.py:1884(main)
        3    0.000    0.000    0.000    0.000 gitchangelog.py:1899(<lambda>)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:1931(<lambda>)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:1932(<lambda>)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:1934(<lambda>)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:272(ShellError)
      353    0.003    0.000    0.003    0.000 gitchangelog.py:274(__init__)
     1092    0.004    0.000    0.204    0.000 gitchangelog.py:282(set_cwd)
       11    0.000    0.000    0.000    0.000 gitchangelog.py:330(available_in_config)
        1    0.000    0.000    0.443    0.443 gitchangelog.py:335(load_config_file)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:366(TextProc)
       20    0.000    0.000    0.000    0.000 gitchangelog.py:369(__init__)
      286    0.000    0.000    0.013    0.000 gitchangelog.py:374(__call__)
       10    0.000    0.000    0.000    0.000 gitchangelog.py:377(__or__)
  715/286    0.002    0.000    0.012    0.000 gitchangelog.py:379(<lambda>)
      143    0.000    0.000    0.000    0.000 gitchangelog.py:389(set_if_empty)
      143    0.001    0.000    0.001    0.000 gitchangelog.py:395(ucfirst)
        1    0.000    0.000   54.620   54.620 gitchangelog.py:4(<module>)
      143    0.000    0.000    0.000    0.000 gitchangelog.py:402(final_dot)
      601    0.003    0.000    0.008    0.000 gitchangelog.py:409(indent)
      601    0.002    0.000    0.003    0.000 gitchangelog.py:436(<listcomp>)
        3    0.000    0.000    0.000    0.000 gitchangelog.py:459(curryfy)
        2    0.000    0.000    0.000    0.000 gitchangelog.py:460(<lambda>)
        4    0.000    0.000    0.000    0.000 gitchangelog.py:466(<lambda>)
      286    0.000    0.000    0.000    0.000 gitchangelog.py:468(<lambda>)
        4    0.000    0.000    0.027    0.007 gitchangelog.py:479(file_get_contents)
        1    0.009    0.009    0.010    0.010 gitchangelog.py:493(file_put_contents)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:559(Phile)
      264    0.000    0.000    0.000    0.000 gitchangelog.py:602(__init__)
     1680    0.003    0.000    1.162    0.001 gitchangelog.py:607(read)
     4004    0.005    0.000    0.019    0.000 gitchangelog.py:623(write)
      264    0.001    0.000    0.016    0.000 gitchangelog.py:628(close)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:632(Proc)
       88    0.002    0.000    4.963    0.056 gitchangelog.py:634(__init__)
      546    0.012    0.000   47.725    0.087 gitchangelog.py:646(cmd)
      546    0.028    0.000   47.768    0.087 gitchangelog.py:661(wrap)
      546    0.002    0.000   47.770    0.087 gitchangelog.py:706(swrap)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:717(SubGitObjectMixin)
      869    0.001    0.000    0.001    0.000 gitchangelog.py:719(__init__)
      532    0.001    0.000    0.004    0.000 gitchangelog.py:722(git)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:750(GitCommit)
      320    0.001    0.000    0.002    0.000 gitchangelog.py:849(__init__)
  463/320    0.010    0.000   14.902    0.047 gitchangelog.py:854(__getattr__)
      320    0.001    0.000    0.001    0.000 gitchangelog.py:867(<listcomp>)
     2124    0.001    0.000    0.001    0.000 gitchangelog.py:870(<genexpr>)
      143    0.000    0.000    0.015    0.000 gitchangelog.py:911(author_names)
      143    0.001    0.000    0.006    0.000 gitchangelog.py:913(<listcomp>)
      143    0.001    0.000    0.008    0.000 gitchangelog.py:916(authors)
      176    0.002    0.000    0.008    0.000 gitchangelog.py:924(date)
      176    0.005    0.000   14.618    0.083 gitchangelog.py:930(has_annotated_tag)
      176    0.005    0.000   17.097    0.097 gitchangelog.py:954(__le__)
       88    0.000    0.000    7.857    0.089 gitchangelog.py:965(__lt__)
       20    0.000    0.000    0.000    0.000 gitchangelog.py:970(__eq__)
       88    0.000    0.000    0.000    0.000 gitchangelog.py:975(__hash__)
        2    0.000    0.000    0.000    0.000 gitchangelog.py:982(normpath)
        1    0.000    0.000    0.000    0.000 gitchangelog.py:993(GitConfig)
        1    0.000    0.000    0.000    0.000 gitchangelog.rc.reference:61(<module>)
        1    0.000    0.000    0.006    0.006 glob.py:1(<module>)
        1    0.000    0.000   36.302   36.302 init.py:13(render)
        1    0.000    0.000    0.088    0.088 init.py:6(<module>)
        1    0.000    0.000    0.012    0.012 linecache.py:6(<module>)
        1    0.000    0.000    0.000    0.000 loader.py:31(Loader)
        1    0.000    0.000    0.000    0.000 loader.py:40(__init__)
        1    0.000    0.000    0.007    0.007 loader.py:6(<module>)
        3    0.000    0.000    0.000    0.000 locale.py:350(_replace_encoding)
        6    0.000    0.000    0.000    0.000 locale.py:384(normalize)
        3    0.000    0.000    0.000    0.000 locale.py:589(setlocale)
        1    0.000    0.000    0.005    0.005 locale.py:647(getpreferredencoding)
        1    0.000    0.000    0.000    0.000 locator.py:16(Locator)
        1    0.000    0.000    0.000    0.000 locator.py:6(<module>)
      546    0.013    0.000    0.050    0.000 os.py:616(get_exec_path)
     1111    0.006    0.000    0.014    0.000 os.py:673(__getitem__)
     1111    0.005    0.000    0.006    0.000 os.py:751(encode)
      549    0.001    0.000    0.002    0.000 os.py:755(decode)
    21928    0.038    0.000    0.067    0.000 os.py:803(fsencode)
        6    0.000    0.000    0.000    0.000 parsed.py:21(__init__)
       19    0.000    0.000    0.000    0.000 parsed.py:27(add)
    223/1    0.002    0.000   36.299   36.299 parsed.py:37(render)
    973/1    0.001    0.000   36.299   36.299 parsed.py:43(get_unicode)
        1    0.000    0.000    0.000    0.000 parsed.py:6(<module>)
        1    0.000    0.000    0.000    0.000 parsed.py:9(ParsedTemplate)
        1    0.000    0.000    0.000    0.000 parser.py:100(_ChangeNode)
        1    0.000    0.000    0.000    0.000 parser.py:112(_EscapeNode)
        1    0.000    0.000    0.000    0.000 parser.py:125(_LiteralNode)
        4    0.000    0.000    0.000    0.000 parser.py:127(__init__)
      247    0.001    0.000    0.005    0.000 parser.py:133(render)
        1    0.000    0.000    0.000    0.000 parser.py:138(_PartialNode)
        1    0.000    0.000    0.000    0.000 parser.py:155(_InvertedNode)
        1    0.000    0.000    0.000    0.000 parser.py:157(__init__)
       46    0.000    0.000    0.001    0.000 parser.py:164(render)
        1    0.000    0.000    0.000    0.000 parser.py:175(_SectionNode)
        4    0.000    0.000    0.000    0.000 parser.py:180(__init__)
    151/1    0.002    0.000   36.299   36.299 parser.py:191(render)
        1    0.000    0.000    0.003    0.003 parser.py:21(parse)
        1    0.000    0.000    0.000    0.000 parser.py:224(_Parser)
        1    0.000    0.000    0.000    0.000 parser.py:229(__init__)
        1    0.000    0.000    0.003    0.003 parser.py:235(_compile_delimiters)
        1    0.000    0.000    0.003    0.003 parser.py:242(parse)
        4    0.000    0.000    0.000    0.000 parser.py:340(_make_interpolation_node)
        5    0.000    0.000    0.000    0.000 parser.py:365(_make_section_node)
        1    0.000    0.000    0.003    0.003 parser.py:44(_compile_template_re)
        1    0.000    0.000    0.033    0.033 parser.py:6(<module>)
        1    0.000    0.000    0.000    0.000 parser.py:72(ParsingError)
        1    0.000    0.000    0.000    0.000 parser.py:91(_CommentNode)
        1    0.000    0.000    0.000    0.000 posixpath.py:144(basename)
      636    0.004    0.000    0.007    0.000 posixpath.py:154(dirname)
       16    0.000    0.000    0.001    0.000 posixpath.py:168(islink)
        1    0.000    0.000    0.000    0.000 posixpath.py:232(expanduser)
        6    0.000    0.000    0.000    0.000 posixpath.py:338(normpath)
        4    0.000    0.000    0.000    0.000 posixpath.py:376(abspath)
        2    0.000    0.000    0.001    0.001 posixpath.py:391(realpath)
        2    0.000    0.000    0.001    0.001 posixpath.py:400(_joinrealpath)
    21975    0.016    0.000    0.022    0.000 posixpath.py:41(_get_sep)
        8    0.000    0.000    0.000    0.000 posixpath.py:64(isabs)
    21330    0.086    0.000    0.137    0.000 posixpath.py:75(join)
       88    0.000    0.000    0.001    0.000 re.py:170(match)
     1034    0.002    0.000    0.014    0.000 re.py:180(search)
      431    0.001    0.000    0.054    0.000 re.py:185(sub)
       18    0.000    0.000    0.005    0.000 re.py:232(compile)
        2    0.000    0.000    0.000    0.000 re.py:252(escape)
     1571    0.004    0.000    0.019    0.000 re.py:271(_compile)
        4    0.000    0.000    0.039    0.010 re.py:297(_compile_repl)
      288    0.001    0.000    0.040    0.000 re.py:307(_subx)
      217    0.000    0.000    0.002    0.000 re.py:313(filter)
      247    0.001    0.000    0.004    0.000 renderengine.py:100(fetch_string)
      151    0.001    0.000    0.003    0.000 renderengine.py:116(fetch_section_data)
      444    0.001    0.000    0.004    0.000 renderengine.py:14(context_get)
        1    0.000    0.000   36.302   36.302 renderengine.py:167(render)
        1    0.000    0.000    0.000    0.000 renderengine.py:22(RenderEngine)
        1    0.000    0.000    0.000    0.000 renderengine.py:45(__init__)
        1    0.000    0.000    0.000    0.000 renderengine.py:6(<module>)
      248    0.000    0.000    0.000    0.000 renderer.py:173(_to_unicode_soft)
      248    0.000    0.000    0.001    0.000 renderer.py:184(_to_unicode_hard)
        1    0.000    0.000    0.000    0.000 renderer.py:20(Renderer)
        1    0.000    0.000    0.000    0.000 renderer.py:227(_make_loader)
        1    0.000    0.000    0.000    0.000 renderer.py:235(_make_load_template)
        1    0.000    0.000    0.000    0.000 renderer.py:247(_make_load_partial)
        2    0.000    0.000    0.000    0.000 renderer.py:273(_is_missing_tags_strict)
        1    0.000    0.000    0.000    0.000 renderer.py:287(_make_resolve_partial)
        1    0.000    0.000    0.000    0.000 renderer.py:306(_make_resolve_context)
      444    0.000    0.000    0.005    0.000 renderer.py:315(resolve_context)
        1    0.000    0.000    0.000    0.000 renderer.py:323(_make_render_engine)
        1    0.000    0.000   36.302   36.302 renderer.py:392(_render_string)
        1    0.000    0.000   36.302   36.302 renderer.py:400(<lambda>)
        1    0.000    0.000   36.302   36.302 renderer.py:406(_render_final)
        1    0.000    0.000   36.302   36.302 renderer.py:421(render)
        1    0.000    0.000    0.000    0.000 renderer.py:50(__init__)
        1    0.000    0.000    0.040    0.040 renderer.py:6(<module>)
      546    0.000    0.000    0.000    0.000 selectors.py:199(__enter__)
      546    0.001    0.000    0.004    0.000 selectors.py:202(__exit__)
        1    0.000    0.000    0.000    0.000 selectors.py:206(_BaseSelectorImpl)
      546    0.003    0.000    0.004    0.000 selectors.py:209(__init__)
     2184    0.010    0.000    0.021    0.000 selectors.py:21(_fileobj_to_fd)
     2184    0.003    0.000    0.024    0.000 selectors.py:215(_fileobj_lookup)
     1092    0.007    0.000    0.016    0.000 selectors.py:234(register)
     1092    0.004    0.000    0.023    0.000 selectors.py:247(unregister)
      546    0.003    0.000    0.003    0.000 selectors.py:268(close)
     1516    0.002    0.000    0.002    0.000 selectors.py:272(get_map)
     1459    0.004    0.000    0.004    0.000 selectors.py:275(_key_from_fd)
        1    0.000    0.000    0.000    0.000 selectors.py:290(SelectSelector)
        1    0.000    0.000    0.000    0.000 selectors.py:341(_PollLikeSelector)
      546    0.004    0.000    0.008    0.000 selectors.py:347(__init__)
     1092    0.005    0.000    0.022    0.000 selectors.py:351(register)
     1092    0.009    0.000    0.034    0.000 selectors.py:365(unregister)
      970    0.028    0.000   17.842    0.018 selectors.py:402(select)
        1    0.000    0.000    0.000    0.000 selectors.py:433(PollSelector)
        1    0.000    0.000    0.006    0.006 selectors.py:5(<module>)
        1    0.000    0.000    0.000    0.000 selectors.py:60(_SelectorMapping)
      546    0.001    0.000    0.001    0.000 selectors.py:63(__init__)
     1516    0.005    0.000    0.006    0.000 selectors.py:66(__len__)
        1    0.000    0.000    0.000    0.000 selectors.py:80(BaseSelector)
        1    0.000    0.000    0.001    0.001 signal.py:1(<module>)
       73    0.000    0.000    0.000    0.000 signal.py:10(<lambda>)
       74    0.000    0.000    0.000    0.000 signal.py:17(<lambda>)
        1    0.000    0.000    0.000    0.000 specloader.py:14(SpecLoader)
        1    0.000    0.000    0.000    0.000 specloader.py:6(<module>)
       54    0.000    0.000    0.000    0.000 sre_compile.py:249(_compile_charset)
       54    0.000    0.000    0.001    0.000 sre_compile.py:276(_optimize_charset)
       10    0.000    0.000    0.000    0.000 sre_compile.py:411(_mk_bitmap)
       10    0.000    0.000    0.000    0.000 sre_compile.py:413(<listcomp>)
       63    0.000    0.000    0.000    0.000 sre_compile.py:423(_simple)
        4    0.000    0.000    0.000    0.000 sre_compile.py:432(_generate_overlap_table)
       44    0.000    0.000    0.000    0.000 sre_compile.py:453(_get_iscased)
    27/21    0.000    0.000    0.000    0.000 sre_compile.py:461(_get_literal_prefix)
       17    0.000    0.000    0.000    0.000 sre_compile.py:492(_get_charset_prefix)
       24    0.000    0.000    0.001    0.000 sre_compile.py:536(_compile_info)
       48    0.000    0.000    0.000    0.000 sre_compile.py:595(isstring)
       24    0.000    0.000    0.005    0.000 sre_compile.py:598(_code)
       37    0.000    0.000    0.000    0.000 sre_compile.py:65(_combine_flags)
   138/24    0.002    0.000    0.004    0.000 sre_compile.py:71(_compile)
       24    0.000    0.000    0.013    0.001 sre_compile.py:759(compile)
      217    0.001    0.000    0.001    0.000 sre_parse.py:1036(expand_template)
      144    0.000    0.000    0.000    0.000 sre_parse.py:111(__init__)
      300    0.000    0.000    0.000    0.000 sre_parse.py:160(__len__)
        4    0.000    0.000    0.000    0.000 sre_parse.py:162(__delitem__)
      996    0.001    0.000    0.001    0.000 sre_parse.py:164(__getitem__)
       68    0.000    0.000    0.000    0.000 sre_parse.py:168(__setitem__)
      294    0.000    0.000    0.000    0.000 sre_parse.py:172(append)
   166/52    0.001    0.000    0.001    0.000 sre_parse.py:174(getwidth)
       28    0.000    0.000    0.000    0.000 sre_parse.py:224(__init__)
     9340    0.014    0.000    0.014    0.000 sre_parse.py:233(__next)
      336    0.000    0.000    0.000    0.000 sre_parse.py:249(match)
     9152    0.011    0.000    0.024    0.000 sre_parse.py:254(get)
       11    0.000    0.000    0.000    0.000 sre_parse.py:267(getuntil)
      193    0.000    0.000    0.000    0.000 sre_parse.py:286(tell)
        1    0.000    0.000    0.000    0.000 sre_parse.py:288(seek)
       18    0.000    0.000    0.000    0.000 sre_parse.py:295(_class_escape)
       35    0.000    0.000    0.000    0.000 sre_parse.py:343(_escape)
       36    0.000    0.000    0.000    0.000 sre_parse.py:408(_uniq)
    58/24    0.000    0.000    0.007    0.000 sre_parse.py:417(_parse_sub)
    72/25    0.003    0.000    0.007    0.000 sre_parse.py:475(_parse)
       24    0.000    0.000    0.000    0.000 sre_parse.py:76(__init__)
      104    0.000    0.000    0.000    0.000 sre_parse.py:81(groups)
       28    0.000    0.000    0.000    0.000 sre_parse.py:84(opengroup)
        1    0.000    0.000    0.000    0.000 sre_parse.py:843(_parse_flags)
       24    0.000    0.000    0.000    0.000 sre_parse.py:903(fix_flags)
       24    0.000    0.000    0.008    0.000 sre_parse.py:919(parse)
        4    0.012    0.003    0.039    0.010 sre_parse.py:951(parse_template)
       28    0.000    0.000    0.000    0.000 sre_parse.py:96(closegroup)
        5    0.000    0.000    0.001    0.000 sre_parse.py:960(addgroup)
      634    0.007    0.000    0.165    0.000 subprocess.py:1329(_get_handles)
      634    0.049    0.000   34.115    0.054 subprocess.py:1383(_execute_child)
    21840    0.044    0.000    0.243    0.000 subprocess.py:1442(<genexpr>)
      633    0.002    0.000    0.005    0.000 subprocess.py:1526(_handle_exitstatus)
      741    0.002    0.000    0.033    0.000 subprocess.py:1544(_internal_poll)
      546    0.002    0.000    0.178    0.000 subprocess.py:1579(_try_wait)
     1092    0.012    0.000    0.194    0.000 subprocess.py:1592(_wait)
      546    0.050    0.000   18.274    0.033 subprocess.py:1633(_communicate)
      546    0.001    0.000    0.001    0.000 subprocess.py:1730(_save_input)
      634    0.002    0.000    0.026    0.000 subprocess.py:226(_cleanup)
        1    0.000    0.000    0.000    0.000 subprocess.py:398(CompletedProcess)
        1    0.000    0.000    0.032    0.032 subprocess.py:42(<module>)
        1    0.000    0.000    0.000    0.000 subprocess.py:57(SubprocessError)
        1    0.000    0.000    0.000    0.000 subprocess.py:60(CalledProcessError)
        1    0.000    0.000    0.000    0.000 subprocess.py:608(Popen)
      634    0.024    0.000   34.383    0.054 subprocess.py:656(__init__)
      634    0.003    0.000    0.013    0.000 subprocess.py:850(__del__)
      546    0.009    0.000   18.286    0.033 subprocess.py:895(communicate)
     2062    0.001    0.000    0.001    0.000 subprocess.py:969(_remaining_time)
        1    0.000    0.000    0.000    0.000 subprocess.py:97(TimeoutExpired)
      970    0.001    0.000    0.001    0.000 subprocess.py:977(_check_timeout)
     1092    0.003    0.000    0.197    0.000 subprocess.py:985(wait)
        1    0.000    0.000    0.000    0.000 template_spec.py:10(<module>)
        1    0.000    0.000    0.000    0.000 template_spec.py:12(TemplateSpec)
        1    0.000    0.000    0.001    0.001 threading.py:1(<module>)
        1    0.000    0.000    0.000    0.000 threading.py:1116(daemon)
        1    0.000    0.000    0.000    0.000 threading.py:1154(Timer)
        1    0.000    0.000    0.000    0.000 threading.py:1184(_MainThread)
        1    0.000    0.000    0.000    0.000 threading.py:1186(__init__)
        1    0.000    0.000    0.000    0.000 threading.py:1203(_DummyThread)
        1    0.000    0.000    0.000    0.000 threading.py:204(Condition)
        1    0.000    0.000    0.000    0.000 threading.py:216(__init__)
        1    0.000    0.000    0.000    0.000 threading.py:240(__enter__)
        1    0.000    0.000    0.000    0.000 threading.py:243(__exit__)
        1    0.000    0.000    0.000    0.000 threading.py:255(_is_owned)
        1    0.000    0.000    0.000    0.000 threading.py:335(notify)
        1    0.000    0.000    0.000    0.000 threading.py:358(notify_all)
        1    0.000    0.000    0.000    0.000 threading.py:370(Semaphore)
        1    0.000    0.000    0.000    0.000 threading.py:450(BoundedSemaphore)
        1    0.000    0.000    0.000    0.000 threading.py:488(Event)
        1    0.000    0.000    0.000    0.000 threading.py:499(__init__)
        1    0.000    0.000    0.000    0.000 threading.py:513(set)
        1    0.000    0.000    0.000    0.000 threading.py:567(Barrier)
        1    0.000    0.000    0.000    0.000 threading.py:721(BrokenBarrierError)
        1    0.000    0.000    0.000    0.000 threading.py:744(Thread)
        1    0.000    0.000    0.000    0.000 threading.py:763(__init__)
        1    0.000    0.000    0.000    0.000 threading.py:88(_RLock)
        1    0.000    0.000    0.000    0.000 threading.py:896(_set_ident)
        1    0.000    0.000    0.000    0.000 threading.py:899(_set_tstate_lock)
        1    0.000    0.000    0.000    0.000 token.py:1(<module>)
        1    0.000    0.000    0.000    0.000 token.py:78(<dictcomp>)
       20    0.000    0.000    0.000    0.000 tokenize.py:107(group)
        1    0.000    0.000    0.000    0.000 tokenize.py:108(any)
        2    0.000    0.000    0.000    0.000 tokenize.py:109(maybe)
        3    0.000    0.000    0.000    0.000 tokenize.py:132(_all_string_prefixes)
       24    0.000    0.000    0.000    0.000 tokenize.py:143(<listcomp>)
        1    0.000    0.000    0.007    0.007 tokenize.py:21(<module>)
        1    0.000    0.000    0.000    0.000 tokenize.py:212(TokenError)
        1    0.000    0.000    0.000    0.000 tokenize.py:214(StopTokenizing)
        1    0.000    0.000    0.000    0.000 tokenize.py:217(Untokenizer)
        1    0.000    0.000    0.000    0.000 tokenize.py:94(TokenInfo)
        1    0.000    0.000    0.028    0.028 traceback.py:1(<module>)
        1    0.000    0.000    0.000    0.000 traceback.py:227(FrameSummary)
        1    0.000    0.000    0.000    0.000 traceback.py:315(StackSummary)
        1    0.000    0.000    0.000    0.000 traceback.py:437(TracebackException)
        8    0.000    0.000    0.000    0.000 types.py:164(__get__)
      546    0.002    0.000    0.009    0.000 warnings.py:165(simplefilter)
      546    0.004    0.000    0.006    0.000 warnings.py:181(_add_filter)
      546    0.002    0.000    0.002    0.000 warnings.py:453(__init__)
      546    0.003    0.000    0.003    0.000 warnings.py:474(__enter__)
      546    0.002    0.000    0.002    0.000 warnings.py:493(__exit__)
     1157    0.001    0.000    0.001    0.000 {built-in method __new__ of type object at 0x3dffc6c40}
        6    0.000    0.000    0.000    0.000 {built-in method _abc._abc_init}
        4    0.000    0.000    0.000    0.000 {built-in method _codecs.utf_8_decode}
       30    0.000    0.000    0.000    0.000 {built-in method _imp._fix_co_filename}
      181    0.000    0.000    0.000    0.000 {built-in method _imp.acquire_lock}
        4    0.008    0.002    0.008    0.002 {built-in method _imp.create_dynamic}
        4    0.000    0.000    0.000    0.000 {built-in method _imp.exec_dynamic}
       21    0.000    0.000    0.000    0.000 {built-in method _imp.is_builtin}
       35    0.000    0.000    0.000    0.000 {built-in method _imp.is_frozen}
      181    0.000    0.000    0.000    0.000 {built-in method _imp.release_lock}
        6    0.000    0.000    0.000    0.000 {built-in method _locale.nl_langinfo}
        3    0.000    0.000    0.000    0.000 {built-in method _locale.setlocale}
      634   19.408    0.031   19.408    0.031 {built-in method _posixsubprocess.fork_exec}
       24    0.000    0.000    0.000    0.000 {built-in method _sre.compile}
       16    0.000    0.000    0.000    0.000 {built-in method _stat.S_ISLNK}
        3    0.000    0.000    0.000    0.000 {built-in method _stat.S_ISREG}
        1    0.000    0.000    0.000    0.000 {built-in method _thread._set_sentinel}
      707    0.005    0.000    0.005    0.000 {built-in method _thread.allocate_lock}
       83    0.000    0.000    0.000    0.000 {built-in method _thread.get_ident}
     1638    0.001    0.000    0.001    0.000 {built-in method _warnings._filters_mutated}
       88    0.001    0.000    0.001    0.000 {built-in method _warnings.warn}
    95/93    0.002    0.000    0.002    0.000 {built-in method builtins.__build_class__}
        1    0.000    0.000    0.026    0.026 {built-in method builtins.__import__}
       72    0.000    0.000    0.000    0.000 {built-in method builtins.abs}
      179    0.000    0.000    0.001    0.000 {built-in method builtins.any}
      479    0.000    0.000    0.000    0.000 {built-in method builtins.callable}
      253    0.000    0.000    0.000    0.000 {built-in method builtins.chr}
        2    0.000    0.000    0.000    0.000 {built-in method builtins.compile}
       45    0.000    0.000    0.000    0.000 {built-in method builtins.divmod}
     35/1    0.000    0.000   54.620   54.620 {built-in method builtins.exec}
3020/2865    0.005    0.000    0.211    0.000 {built-in method builtins.getattr}
        6    0.000    0.000    0.000    0.000 {built-in method builtins.globals}
      496    0.001    0.000    0.001    0.000 {built-in method builtins.hasattr}
       88    0.000    0.000    0.000    0.000 {built-in method builtins.hash}
    59442    0.027    0.000    0.027    0.000 {built-in method builtins.isinstance}
       18    0.000    0.000    0.000    0.000 {built-in method builtins.issubclass}
      151    0.000    0.000    0.000    0.000 {built-in method builtins.iter}
4583/4438    0.003    0.000    0.003    0.000 {built-in method builtins.len}
        8    0.000    0.000    0.000    0.000 {built-in method builtins.locals}
       27    0.000    0.000    0.000    0.000 {built-in method builtins.max}
      412    0.001    0.000    7.858    0.019 {built-in method builtins.min}
2420/2129    0.003    0.000   18.157    0.009 {built-in method builtins.next}
      211    0.000    0.000    0.000    0.000 {built-in method builtins.ord}
        2    0.000    0.000    0.000    0.000 {built-in method builtins.repr}
        9    0.000    0.000    0.000    0.000 {built-in method builtins.round}
     3603    0.003    0.000    0.003    0.000 {built-in method builtins.setattr}
  778/691    0.003    0.000    6.616    0.010 {built-in method builtins.sorted}
        2    0.000    0.000    0.000    0.000 {built-in method builtins.vars}
       90    0.000    0.000    0.000    0.000 {built-in method from_bytes}
     1907    0.075    0.000    0.075    0.000 {built-in method io.open}
       30    0.004    0.000    0.004    0.000 {built-in method marshal.loads}
      633    0.000    0.000    0.000    0.000 {built-in method posix.WEXITSTATUS}
      633    0.000    0.000    0.000    0.000 {built-in method posix.WIFEXITED}
      633    0.001    0.000    0.001    0.000 {built-in method posix.WIFSIGNALED}
     1093    0.197    0.000    0.197    0.000 {built-in method posix.chdir}
     3170    0.036    0.000    0.036    0.000 {built-in method posix.close}
    44010    0.015    0.000    0.015    0.000 {built-in method posix.fspath}
      549    0.004    0.000    0.004    0.000 {built-in method posix.getcwd}
        4    0.001    0.000    0.001    0.000 {built-in method posix.listdir}
       16    0.001    0.000    0.001    0.000 {built-in method posix.lstat}
     2536    0.203    0.000    0.203    0.000 {built-in method posix.pipe}
     2093   14.294    0.007   14.294    0.007 {built-in method posix.read}
        1    0.000    0.000    0.000    0.000 {built-in method posix.register_at_fork}
      178    0.013    0.000    0.013    0.000 {built-in method posix.stat}
      741    0.204    0.000    0.204    0.000 {built-in method posix.waitpid}
      546    0.001    0.000    0.001    0.000 {built-in method select.poll}
        2    0.000    0.000    0.000    0.000 {built-in method sys._getframe}
      353    0.001    0.000    0.001    0.000 {built-in method sys.exc_info}
        2    0.000    0.000    0.000    0.000 {built-in method sys.getdefaultencoding}
        2    0.000    0.000    0.000    0.000 {built-in method sys.intern}
      266    0.001    0.000    0.001    0.000 {built-in method time.perf_counter}
      176    0.001    0.000    0.001    0.000 {built-in method utcfromtimestamp}
        5    0.000    0.000    0.000    0.000 {function Config.__getitem__ at 0x6ffff843200}
       11    0.000    0.000    0.000    0.000 {method '__contains__' of 'frozenset' objects}
        1    0.000    0.000    0.000    0.000 {method '__enter__' of '_thread.lock' objects}
        1    0.000    0.000    0.000    0.000 {method '__exit__' of '_thread.lock' objects}
      197    0.001    0.000    0.001    0.000 {method 'acquire' of '_thread.lock' objects}
      818    0.001    0.000    0.001    0.000 {method 'add' of 'set' objects}
    15015    0.006    0.000    0.006    0.000 {method 'append' of 'list' objects}
      546    0.001    0.000    0.001    0.000 {method 'clear' of 'dict' objects}
     1268    0.066    0.000    0.066    0.000 {method 'close' of '_io.BufferedReader' objects}
      634    0.023    0.000    0.023    0.000 {method 'close' of '_io.BufferedWriter' objects}
        1    0.000    0.000    0.000    0.000 {method 'copy' of 'dict' objects}
      546    0.001    0.000    0.001    0.000 {method 'count' of 'list' objects}
     3233    0.006    0.000    0.006    0.000 {method 'decode' of 'bytes' objects}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
    26674    0.018    0.000    0.018    0.000 {method 'encode' of 'str' objects}
       14    0.000    0.000    0.000    0.000 {method 'end' of 're.Match' objects}
    21294    0.011    0.000    0.011    0.000 {method 'endswith' of 'bytes' objects}
      276    0.000    0.000    0.000    0.000 {method 'endswith' of 'str' objects}
      234    0.000    0.000    0.000    0.000 {method 'extend' of 'list' objects}
     2184    0.004    0.000    0.004    0.000 {method 'fileno' of '_io.BufferedReader' objects}
      178    0.000    0.000    0.000    0.000 {method 'find' of 'bytearray' objects}
       18    0.000    0.000    0.000    0.000 {method 'find' of 'str' objects}
      546    0.004    0.000    0.004    0.000 {method 'flush' of '_io.BufferedWriter' objects}
        2    0.000    0.000    0.000    0.000 {method 'format' of 'str' objects}
      573    0.000    0.000    0.000    0.000 {method 'get' of 'dict' objects}
       52    0.000    0.000    0.000    0.000 {method 'get' of 'mappingproxy' objects}
      218    0.000    0.000    0.000    0.000 {method 'group' of 're.Match' objects}
       14    0.000    0.000    0.000    0.000 {method 'groupdict' of 're.Match' objects}
        1    0.000    0.000    0.000    0.000 {method 'groups' of 're.Match' objects}
        3    0.000    0.000    0.000    0.000 {method 'index' of 'str' objects}
      548    0.001    0.000    0.001    0.000 {method 'insert' of 'list' objects}
      158    0.000    0.000    0.000    0.000 {method 'isalnum' of 'str' objects}
       22    0.000    0.000    0.000    0.000 {method 'isidentifier' of 'str' objects}
       73    0.000    0.000    0.000    0.000 {method 'isupper' of 'str' objects}
       38    0.000    0.000    0.000    0.000 {method 'items' of 'collections.OrderedDict' objects}
      360    0.000    0.000    0.000    0.000 {method 'items' of 'dict' objects}
       10    0.000    0.000    0.000    0.000 {method 'items' of 'mappingproxy' objects}
     1092    0.001    0.000    0.001    0.000 {method 'join' of 'bytes' objects}
     2413    0.003    0.000    0.004    0.000 {method 'join' of 'str' objects}
      470    0.000    0.000    0.000    0.000 {method 'keys' of 'dict' objects}
       41    0.000    0.000    0.000    0.000 {method 'lower' of 'str' objects}
        2    0.000    0.000    0.000    0.000 {method 'lstrip' of 'str' objects}
       94    0.000    0.000    0.000    0.000 {method 'match' of 're.Pattern' objects}
        2    0.000    0.000    0.000    0.000 {method 'mro' of 'type' objects}
       16    0.000    0.000    0.000    0.000 {method 'partition' of 'str' objects}
      970   17.809    0.018   17.809    0.018 {method 'poll' of 'select.poll' objects}
     1103    0.001    0.000    0.001    0.000 {method 'pop' of 'dict' objects}
      226    0.000    0.000    0.000    0.000 {method 'pop' of 'list' objects}
      157    1.156    0.007    1.156    0.007 {method 'read' of '_io.BufferedReader' objects}
       30    0.002    0.000    0.002    0.000 {method 'read' of '_io.FileIO' objects}
        4    0.000    0.000    0.000    0.000 {method 'read' of '_io.TextIOWrapper' objects}
     1092    0.001    0.000    0.001    0.000 {method 'register' of 'select.poll' objects}
      195    0.001    0.000    0.001    0.000 {method 'release' of '_thread.lock' objects}
      612    0.002    0.000    0.002    0.000 {method 'remove' of 'list' objects}
      742    0.002    0.000    0.002    0.000 {method 'replace' of 'str' objects}
        6    0.000    0.000    0.000    0.000 {method 'reverse' of 'list' objects}
      634    0.001    0.000    0.001    0.000 {method 'rfind' of 'bytes' objects}
        3    0.000    0.000    0.000    0.000 {method 'rfind' of 'str' objects}
      287    0.000    0.000    0.000    0.000 {method 'rpartition' of 'str' objects}
       88    0.000    0.000    0.000    0.000 {method 'rstrip' of 'bytes' objects}
     2102    0.001    0.000    0.001    0.000 {method 'rstrip' of 'str' objects}
     1049    0.004    0.000    0.004    0.000 {method 'search' of 're.Pattern' objects}
       42    0.000    0.000    0.000    0.000 {method 'setdefault' of 'dict' objects}
        5    0.000    0.000    0.000    0.000 {method 'setter' of 'property' objects}
        2    0.000    0.000    0.000    0.000 {method 'sort' of 'list' objects}
       69    0.001    0.000    0.001    0.000 {method 'split' of 'bytes' objects}
     1784    0.009    0.000    0.009    0.000 {method 'split' of 'str' objects}
        1    0.000    0.000    0.000    0.000 {method 'splitlines' of 'str' objects}
       14    0.000    0.000    0.000    0.000 {method 'start' of 're.Match' objects}
    21294    0.012    0.000    0.012    0.000 {method 'startswith' of 'bytes' objects}
      287    0.000    0.000    0.000    0.000 {method 'startswith' of 'str' objects}
      176    0.005    0.000    0.005    0.000 {method 'strftime' of 'datetime.date' objects}
     2569    0.001    0.000    0.001    0.000 {method 'strip' of 'str' objects}
      431    0.005    0.000    0.047    0.000 {method 'sub' of 're.Pattern' objects}
      353    0.001    0.000    0.087    0.000 {method 'throw' of 'generator' objects}
       10    0.000    0.000    0.000    0.000 {method 'translate' of 'bytearray' objects}
        2    0.000    0.000    0.000    0.000 {method 'translate' of 'str' objects}
     1092    0.002    0.000    0.002    0.000 {method 'unregister' of 'select.poll' objects}
       12    0.000    0.000    0.000    0.000 {method 'update' of 'dict' objects}
      180    0.000    0.000    0.000    0.000 {method 'upper' of 'str' objects}
        2    0.000    0.000    0.000    0.000 {method 'values' of 'dict' objects}
     4004    0.012    0.000    0.012    0.000 {method 'write' of '_io.BufferedWriter' objects}
        1    0.000    0.000    0.000    0.000 {method 'write' of '_io.TextIOWrapper' objects}

@Lucas-C
Copy link
Author

Lucas-C commented Feb 12, 2020

54s spent in built-in method builtins.exec means the performance issue appears when invoking sub-processes.

Unless you see a way to reduce the number of those calls, I do not think there is much that can be done in my case.

@vaab
Copy link
Owner

vaab commented Feb 12, 2020

Well, you still didn't tell me what setup of gitchangelog you used in your call (with reproduceability in mind: which repository, on which commit, and if you do some .gitchangelog.rc tinkering.) It would be nice to know also your exact platform (windows 10 ? rev ?), your cygwin version. Your computer basic specs (RAM, cpu, model or age), so I'm not sure how I can compare my 15s with your timings. If my timings are much better than yours, you might want to check things listed here: https://superuser.com/questions/877051/cygwin-from-windows-is-very-slow-laggy for a start.

If you already know how to use docker in any way, you could also launch gitchangelog through a docker. It could really speed things up whatever is your docker implementation (in virtualbox, WSL or WSL2).

I still need to know if gitchangelog is slow in cygwin in general, or slow only on your setup. I could let this issue open in the former case, as I'm interested to give a nice experience to all users.

@Lucas-C
Copy link
Author

Lucas-C commented Feb 12, 2020

Sure, if you want more info:

  • I use a Windows 10 64bits with 16GB of RAM, with Cygwin 3.0.7(0.338/5/3)
  • I tested gitchangelog with a fresh clone of https://github.com/voyages-sncf-technologies/hesperides, but I know have an execution time of 41s... I think there is too much variation on my development environment to be reliable for evaluating precisely the performance bottlenecks of gitchangelog

I know Docker well, I'll try to launch gitchangelog through it whenever I have some more time

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants