Giter VIP home page Giter VIP logo

Comments (8)

vaab avatar vaab commented on May 30, 2024

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.

from gitchangelog.

vaab avatar vaab commented on May 30, 2024

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.

from gitchangelog.

Lucas-C avatar Lucas-C commented on May 30, 2024

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

from gitchangelog.

vaab avatar vaab commented on May 30, 2024

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 ?

from gitchangelog.

Lucas-C avatar Lucas-C commented on May 30, 2024

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}

from gitchangelog.

Lucas-C avatar Lucas-C commented on May 30, 2024

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.

from gitchangelog.

vaab avatar vaab commented on May 30, 2024

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.

from gitchangelog.

Lucas-C avatar Lucas-C commented on May 30, 2024

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

from gitchangelog.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.