Show More
@@ -687,6 +687,59 b' def _dispatch(req):' | |||
|
687 | 687 | if repo and repo != req.repo: |
|
688 | 688 | repo.close() |
|
689 | 689 | |
|
690 | def lsprofile(ui, func, fp): | |
|
691 | format = ui.config('profiling', 'format', default='text') | |
|
692 | field = ui.config('profiling', 'sort', default='inlinetime') | |
|
693 | climit = ui.configint('profiling', 'nested', default=5) | |
|
694 | ||
|
695 | if not format in ['text', 'kcachegrind']: | |
|
696 | ui.warn(_("unrecognized profiling format '%s'" | |
|
697 | " - Ignored\n") % format) | |
|
698 | format = 'text' | |
|
699 | ||
|
700 | try: | |
|
701 | from mercurial import lsprof | |
|
702 | except ImportError: | |
|
703 | raise util.Abort(_( | |
|
704 | 'lsprof not available - install from ' | |
|
705 | 'http://codespeak.net/svn/user/arigo/hack/misc/lsprof/')) | |
|
706 | p = lsprof.Profiler() | |
|
707 | p.enable(subcalls=True) | |
|
708 | try: | |
|
709 | return func() | |
|
710 | finally: | |
|
711 | p.disable() | |
|
712 | ||
|
713 | if format == 'kcachegrind': | |
|
714 | import lsprofcalltree | |
|
715 | calltree = lsprofcalltree.KCacheGrind(p) | |
|
716 | calltree.output(fp) | |
|
717 | else: | |
|
718 | # format == 'text' | |
|
719 | stats = lsprof.Stats(p.getstats()) | |
|
720 | stats.sort(field) | |
|
721 | stats.pprint(limit=30, file=fp, climit=climit) | |
|
722 | ||
|
723 | def statprofile(ui, func, fp): | |
|
724 | try: | |
|
725 | import statprof | |
|
726 | except ImportError: | |
|
727 | raise util.Abort(_( | |
|
728 | 'statprof not available - install using "easy_install statprof"')) | |
|
729 | ||
|
730 | freq = ui.configint('profiling', 'freq', default=1000) | |
|
731 | if freq > 0: | |
|
732 | statprof.reset(freq) | |
|
733 | else: | |
|
734 | ui.warn(_("invalid sampling frequency '%s' - ignoring\n") % freq) | |
|
735 | ||
|
736 | statprof.start() | |
|
737 | try: | |
|
738 | return func() | |
|
739 | finally: | |
|
740 | statprof.stop() | |
|
741 | statprof.display(fp) | |
|
742 | ||
|
690 | 743 | def _runcommand(ui, options, cmd, cmdfunc): |
|
691 | 744 | def checkargs(): |
|
692 | 745 | try: |
@@ -695,47 +748,28 b' def _runcommand(ui, options, cmd, cmdfun' | |||
|
695 | 748 | raise error.CommandError(cmd, _("invalid arguments")) |
|
696 | 749 | |
|
697 | 750 | if options['profile']: |
|
698 | format = ui.config('profiling', 'format', default='text') | |
|
699 | field = ui.config('profiling', 'sort', default='inlinetime') | |
|
700 |
|
|
|
701 | ||
|
702 | if not format in ['text', 'kcachegrind']: | |
|
703 | ui.warn(_("unrecognized profiling format '%s'" | |
|
704 | " - Ignored\n") % format) | |
|
705 | format = 'text' | |
|
751 | profiler = os.getenv('HGPROF') | |
|
752 | if profiler is None: | |
|
753 | profiler = ui.config('profiling', 'type', default='ls') | |
|
754 | if profiler not in ('ls', 'stat'): | |
|
755 | ui.warn(_("unrecognized profiler '%s' - ignored\n") % profiler) | |
|
756 | profiler = 'ls' | |
|
706 | 757 | |
|
707 | 758 | output = ui.config('profiling', 'output') |
|
708 | 759 | |
|
709 | 760 | if output: |
|
710 | 761 | path = ui.expandpath(output) |
|
711 |
|
|
|
762 | fp = open(path, 'wb') | |
|
712 | 763 | else: |
|
713 |
|
|
|
764 | fp = sys.stderr | |
|
714 | 765 | |
|
715 | 766 | try: |
|
716 | from mercurial import lsprof | |
|
717 | except ImportError: | |
|
718 | raise util.Abort(_( | |
|
719 | 'lsprof not available - install from ' | |
|
720 | 'http://codespeak.net/svn/user/arigo/hack/misc/lsprof/')) | |
|
721 | p = lsprof.Profiler() | |
|
722 | p.enable(subcalls=True) | |
|
723 | try: | |
|
724 | return checkargs() | |
|
767 | if profiler == 'ls': | |
|
768 | return lsprofile(ui, checkargs, fp) | |
|
769 | else: | |
|
770 | return statprofile(ui, checkargs, fp) | |
|
725 | 771 | finally: |
|
726 | p.disable() | |
|
727 | ||
|
728 | if format == 'kcachegrind': | |
|
729 | import lsprofcalltree | |
|
730 | calltree = lsprofcalltree.KCacheGrind(p) | |
|
731 | calltree.output(ostream) | |
|
732 | else: | |
|
733 | # format == 'text' | |
|
734 | stats = lsprof.Stats(p.getstats()) | |
|
735 | stats.sort(field) | |
|
736 | stats.pprint(limit=30, file=ostream, climit=climit) | |
|
737 | ||
|
738 | 772 | if output: |
|
739 |
|
|
|
773 | fp.close() | |
|
740 | 774 | else: |
|
741 | 775 | return checkargs() |
@@ -938,14 +938,31 b' information about working with phases.' | |||
|
938 | 938 | ``profiling`` |
|
939 | 939 | """"""""""""" |
|
940 | 940 | |
|
941 |
Specifies profiling format and file output. |
|
|
942 | description, 'profiling data' stands for the raw data collected | |
|
943 | during profiling, while 'profiling report' stands for a statistical | |
|
944 | text report generated from the profiling data. The profiling is done | |
|
945 | using lsprof. | |
|
941 | Specifies profiling type, format, and file output. Two profilers are | |
|
942 | supported: an instrumenting profiler (named ``ls``), and a sampling | |
|
943 | profiler (named ``stat``). | |
|
944 | ||
|
945 | In this section description, 'profiling data' stands for the raw data | |
|
946 | collected during profiling, while 'profiling report' stands for a | |
|
947 | statistical text report generated from the profiling data. The | |
|
948 | profiling is done using lsprof. | |
|
949 | ||
|
950 | ``type`` | |
|
951 | The type of profiler to use. | |
|
952 | Default: ls. | |
|
953 | ||
|
954 | ``ls`` | |
|
955 | Use Python's built-in instrumenting profiler. This profiler | |
|
956 | works on all platforms, but each line number it reports is the | |
|
957 | first line of a function. This restriction makes it difficult to | |
|
958 | identify the expensive parts of a non-trivial function. | |
|
959 | ``stat`` | |
|
960 | Use a third-party statistical profiler, statprof. This profiler | |
|
961 | currently runs only on Unix systems, and is most useful for | |
|
962 | profiling commands that run for longer than about 0.1 seconds. | |
|
946 | 963 | |
|
947 | 964 | ``format`` |
|
948 | Profiling format. | |
|
965 | Profiling format. Specific to the ``ls`` instrumenting profiler. | |
|
949 | 966 | Default: text. |
|
950 | 967 | |
|
951 | 968 | ``text`` |
@@ -957,6 +974,10 b' using lsprof.' | |||
|
957 | 974 | file, the generated file can directly be loaded into |
|
958 | 975 | kcachegrind. |
|
959 | 976 | |
|
977 | ``frequency`` | |
|
978 | Sampling frequency. Specific to the ``stat`` sampling profiler. | |
|
979 | Default: 1000. | |
|
980 | ||
|
960 | 981 | ``output`` |
|
961 | 982 | File path where profiling data or report should be saved. If the |
|
962 | 983 | file exists, it is replaced. Default: None, data is printed on |
General Comments 0
You need to be logged in to leave comments.
Login now