##// END OF EJS Templates
dispatch: add support for statprof as a profiler...
Bryan O'Sullivan -
r16392:ee3f423d default
parent child Browse files
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 climit = ui.configint('profiling', 'nested', default=5)
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 ostream = open(path, 'wb')
762 fp = open(path, 'wb')
712 763 else:
713 ostream = sys.stderr
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 ostream.close()
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. In this section
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