comparison contrib/perf.py @ 42942:adac17faa72e

perf: add a --stats argument to perfhelper-pathcopies The arguments will display some statisting about the distribution of the value we measure.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 17 Sep 2019 18:36:30 +0200
parents 3a1ad3aeb64a
children b4093d1d3b18
comparison
equal deleted inserted replaced
42941:3a1ad3aeb64a 42942:adac17faa72e
1743 1743
1744 @command(b'perfhelper-pathcopies', formatteropts + 1744 @command(b'perfhelper-pathcopies', formatteropts +
1745 [ 1745 [
1746 (b'r', b'revs', [], b'restrict search to these revisions'), 1746 (b'r', b'revs', [], b'restrict search to these revisions'),
1747 (b'', b'timing', False, b'provides extra data (costly)'), 1747 (b'', b'timing', False, b'provides extra data (costly)'),
1748 (b'', b'stats', False, b'provides statistic about the measured data'),
1748 ]) 1749 ])
1749 def perfhelperpathcopies(ui, repo, revs=[], **opts): 1750 def perfhelperpathcopies(ui, repo, revs=[], **opts):
1750 """find statistic about potential parameters for the `perftracecopies` 1751 """find statistic about potential parameters for the `perftracecopies`
1751 1752
1752 This command find source-destination pair relevant for copytracing testing. 1753 This command find source-destination pair relevant for copytracing testing.
1761 approximation of which revision pairs are very costly. 1762 approximation of which revision pairs are very costly.
1762 """ 1763 """
1763 opts = _byteskwargs(opts) 1764 opts = _byteskwargs(opts)
1764 fm = ui.formatter(b'perf', opts) 1765 fm = ui.formatter(b'perf', opts)
1765 dotiming = opts[b'timing'] 1766 dotiming = opts[b'timing']
1767 dostats = opts[b'stats']
1766 1768
1767 if dotiming: 1769 if dotiming:
1768 header = '%12s %12s %12s %12s %12s %12s\n' 1770 header = '%12s %12s %12s %12s %12s %12s\n'
1769 output = ("%(source)12s %(destination)12s " 1771 output = ("%(source)12s %(destination)12s "
1770 "%(nbrevs)12d %(nbmissingfiles)12d " 1772 "%(nbrevs)12d %(nbmissingfiles)12d "
1779 fm.plain(header % ("source", "destination", "nb-revs", "nb-files")) 1781 fm.plain(header % ("source", "destination", "nb-revs", "nb-files"))
1780 1782
1781 if not revs: 1783 if not revs:
1782 revs = ['all()'] 1784 revs = ['all()']
1783 revs = scmutil.revrange(repo, revs) 1785 revs = scmutil.revrange(repo, revs)
1786
1787
1788 if dostats:
1789 alldata = {
1790 'nbrevs': [],
1791 'nbmissingfiles': [],
1792 }
1793 if dotiming:
1794 alldata['nbrenames'] = []
1795 alldata['time'] = []
1784 1796
1785 roi = repo.revs('merge() and %ld', revs) 1797 roi = repo.revs('merge() and %ld', revs)
1786 for r in roi: 1798 for r in roi:
1787 ctx = repo[r] 1799 ctx = repo[r]
1788 p1 = ctx.p1().rev() 1800 p1 = ctx.p1().rev()
1799 b'source': base.hex(), 1811 b'source': base.hex(),
1800 b'destination': parent.hex(), 1812 b'destination': parent.hex(),
1801 b'nbrevs': len(repo.revs('%d::%d', b, p)), 1813 b'nbrevs': len(repo.revs('%d::%d', b, p)),
1802 b'nbmissingfiles': len(missing), 1814 b'nbmissingfiles': len(missing),
1803 } 1815 }
1816 alldata['nbrevs'].append((
1817 data['nbrevs'],
1818 base.hex(),
1819 parent.hex(),
1820 ))
1821 alldata['nbmissingfiles'].append((
1822 data['nbmissingfiles'],
1823 base.hex(),
1824 parent.hex(),
1825 ))
1804 if dotiming: 1826 if dotiming:
1805 begin = util.timer() 1827 begin = util.timer()
1806 renames = copies.pathcopies(base, parent) 1828 renames = copies.pathcopies(base, parent)
1807 end = util.timer() 1829 end = util.timer()
1808 # not very stable timing since we did only one run 1830 # not very stable timing since we did only one run
1809 data['time'] = end - begin 1831 data['time'] = end - begin
1810 data['nbrenamedfiles'] = len(renames) 1832 data['nbrenamedfiles'] = len(renames)
1833 alldata['time'].append((
1834 data['time'],
1835 base.hex(),
1836 parent.hex(),
1837 ))
1838 alldata['nbrenames'].append((
1839 data['nbrenamedfiles'],
1840 base.hex(),
1841 parent.hex(),
1842 ))
1811 fm.startitem() 1843 fm.startitem()
1812 fm.data(**data) 1844 fm.data(**data)
1813 out = data.copy() 1845 out = data.copy()
1814 out['source'] = fm.hexfunc(base.node()) 1846 out['source'] = fm.hexfunc(base.node())
1815 out['destination'] = fm.hexfunc(parent.node()) 1847 out['destination'] = fm.hexfunc(parent.node())
1816 fm.plain(output % out) 1848 fm.plain(output % out)
1817 1849
1818 fm.end() 1850 fm.end()
1851 if dostats:
1852 # use a second formatter because the data are quite different, not sure
1853 # how it flies with the templater.
1854 fm = ui.formatter(b'perf', opts)
1855 entries = [
1856 ('nbrevs', 'number of revision covered'),
1857 ('nbmissingfiles', 'number of missing files at head'),
1858 ]
1859 if dotiming:
1860 entries.append(('nbrenames',
1861 'renamed files'))
1862 entries.append(('time', 'time'))
1863 _displaystats(ui, opts, entries, alldata)
1819 1864
1820 @command(b'perfcca', formatteropts) 1865 @command(b'perfcca', formatteropts)
1821 def perfcca(ui, repo, **opts): 1866 def perfcca(ui, repo, **opts):
1822 opts = _byteskwargs(opts) 1867 opts = _byteskwargs(opts)
1823 timer, fm = gettimer(ui, opts) 1868 timer, fm = gettimer(ui, opts)