##// END OF EJS Templates
perf: add a --stats argument to perfhelper-mergecopies...
marmoute -
r43211:3a1ad3ae default
parent child Browse files
Show More
@@ -1502,10 +1502,57 b' def perftemplating(ui, repo, testedtempl'
1502 1502 timer(format)
1503 1503 fm.end()
1504 1504
1505 def _displaystats(ui, opts, entries, data):
1506 pass
1507 # use a second formatter because the data are quite different, not sure
1508 # how it flies with the templater.
1509 fm = ui.formatter(b'perf-stats', opts)
1510 for key, title in entries:
1511 values = data[key]
1512 nbvalues = len(data)
1513 values.sort()
1514 stats = {
1515 'key': key,
1516 'title': title,
1517 'nbitems': len(values),
1518 'min': values[0][0],
1519 '10%': values[(nbvalues * 10) // 100][0],
1520 '25%': values[(nbvalues * 25) // 100][0],
1521 '50%': values[(nbvalues * 50) // 100][0],
1522 '75%': values[(nbvalues * 75) // 100][0],
1523 '80%': values[(nbvalues * 80) // 100][0],
1524 '85%': values[(nbvalues * 85) // 100][0],
1525 '90%': values[(nbvalues * 90) // 100][0],
1526 '95%': values[(nbvalues * 95) // 100][0],
1527 '99%': values[(nbvalues * 99) // 100][0],
1528 'max': values[-1][0],
1529 }
1530 fm.startitem()
1531 fm.data(**stats)
1532 # make node pretty for the human output
1533 fm.plain('### %s (%d items)\n' % (title, len(values)))
1534 lines = [
1535 'min',
1536 '10%',
1537 '25%',
1538 '50%',
1539 '75%',
1540 '80%',
1541 '85%',
1542 '90%',
1543 '95%',
1544 '99%',
1545 'max',
1546 ]
1547 for l in lines:
1548 fm.plain('%s: %s\n' % (l, stats[l]))
1549 fm.end()
1550
1505 1551 @command(b'perfhelper-mergecopies', formatteropts +
1506 1552 [
1507 1553 (b'r', b'revs', [], b'restrict search to these revisions'),
1508 1554 (b'', b'timing', False, b'provides extra data (costly)'),
1555 (b'', b'stats', False, b'provides statistic about the measured data'),
1509 1556 ])
1510 1557 def perfhelpermergecopies(ui, repo, revs=[], **opts):
1511 1558 """find statistics about potential parameters for `perfmergecopies`
@@ -1525,6 +1572,7 b' def perfhelpermergecopies(ui, repo, revs'
1525 1572 opts = _byteskwargs(opts)
1526 1573 fm = ui.formatter(b'perf', opts)
1527 1574 dotiming = opts[b'timing']
1575 dostats = opts[b'stats']
1528 1576
1529 1577 output_template = [
1530 1578 ("base", "%(base)12s"),
@@ -1553,6 +1601,17 b' def perfhelpermergecopies(ui, repo, revs'
1553 1601 revs = ['all()']
1554 1602 revs = scmutil.revrange(repo, revs)
1555 1603
1604 if dostats:
1605 alldata = {
1606 'nbrevs': [],
1607 'nbmissingfiles': [],
1608 }
1609 if dotiming:
1610 alldata['parentnbrenames'] = []
1611 alldata['totalnbrenames'] = []
1612 alldata['parenttime'] = []
1613 alldata['totaltime'] = []
1614
1556 1615 roi = repo.revs('merge() and %ld', revs)
1557 1616 for r in roi:
1558 1617 ctx = repo[r]
@@ -1572,6 +1631,29 b' def perfhelpermergecopies(ui, repo, revs'
1572 1631 b'p2.nbrevs': len(repo.revs('%d::%d', b.rev(), p2.rev())),
1573 1632 b'p2.nbmissingfiles': len(p2missing),
1574 1633 }
1634 if dostats:
1635 if p1missing:
1636 alldata['nbrevs'].append((
1637 data['p1.nbrevs'],
1638 b.hex(),
1639 p1.hex()
1640 ))
1641 alldata['nbmissingfiles'].append((
1642 data['p1.nbmissingfiles'],
1643 b.hex(),
1644 p1.hex()
1645 ))
1646 if p2missing:
1647 alldata['nbrevs'].append((
1648 data['p2.nbrevs'],
1649 b.hex(),
1650 p2.hex()
1651 ))
1652 alldata['nbmissingfiles'].append((
1653 data['p2.nbmissingfiles'],
1654 b.hex(),
1655 p2.hex()
1656 ))
1575 1657 if dotiming:
1576 1658 begin = util.timer()
1577 1659 mergedata = copies.mergecopies(repo, p1, p2, b)
@@ -1596,6 +1678,43 b' def perfhelpermergecopies(ui, repo, revs'
1596 1678 end = util.timer()
1597 1679 data['p1.renamedfiles'] = len(p1renames)
1598 1680 data['p2.renamedfiles'] = len(p2renames)
1681
1682 if dostats:
1683 if p1missing:
1684 alldata['parentnbrenames'].append((
1685 data['p1.renamedfiles'],
1686 b.hex(),
1687 p1.hex()
1688 ))
1689 alldata['parenttime'].append((
1690 data['p1.time'],
1691 b.hex(),
1692 p1.hex()
1693 ))
1694 if p2missing:
1695 alldata['parentnbrenames'].append((
1696 data['p2.renamedfiles'],
1697 b.hex(),
1698 p2.hex()
1699 ))
1700 alldata['parenttime'].append((
1701 data['p2.time'],
1702 b.hex(),
1703 p2.hex()
1704 ))
1705 if p1missing or p2missing:
1706 alldata['totalnbrenames'].append((
1707 data['nbrenamedfiles'],
1708 b.hex(),
1709 p1.hex(),
1710 p2.hex()
1711 ))
1712 alldata['totaltime'].append((
1713 data['time'],
1714 b.hex(),
1715 p1.hex(),
1716 p2.hex()
1717 ))
1599 1718 fm.startitem()
1600 1719 fm.data(**data)
1601 1720 # make node pretty for the human output
@@ -1606,6 +1725,21 b' def perfhelpermergecopies(ui, repo, revs'
1606 1725 fm.plain(output % out)
1607 1726
1608 1727 fm.end()
1728 if dostats:
1729 # use a second formatter because the data are quite different, not sure
1730 # how it flies with the templater.
1731 entries = [
1732 ('nbrevs', 'number of revision covered'),
1733 ('nbmissingfiles', 'number of missing files at head'),
1734 ]
1735 if dotiming:
1736 entries.append(('parentnbrenames',
1737 'rename from one parent to base'))
1738 entries.append(('totalnbrenames', 'total number of renames'))
1739 entries.append(('parenttime', 'time for one parent'))
1740 entries.append(('totaltime', 'time for both parents'))
1741 _displaystats(ui, opts, entries, alldata)
1742
1609 1743
1610 1744 @command(b'perfhelper-pathcopies', formatteropts +
1611 1745 [
General Comments 0
You need to be logged in to leave comments. Login now