1867 svfs = getsvfs(repo) |
1867 svfs = getsvfs(repo) |
1868 timer(lambda: len(obsolete.obsstore(svfs))) |
1868 timer(lambda: len(obsolete.obsstore(svfs))) |
1869 fm.end() |
1869 fm.end() |
1870 |
1870 |
1871 @command(b'perflrucachedict', formatteropts + |
1871 @command(b'perflrucachedict', formatteropts + |
1872 [(b'', b'size', 4, b'size of cache'), |
1872 [(b'', b'costlimit', 0, b'maximum total cost of items in cache'), |
|
1873 (b'', b'mincost', 0, b'smallest cost of items in cache'), |
|
1874 (b'', b'maxcost', 100, b'maximum cost of items in cache'), |
|
1875 (b'', b'size', 4, b'size of cache'), |
1873 (b'', b'gets', 10000, b'number of key lookups'), |
1876 (b'', b'gets', 10000, b'number of key lookups'), |
1874 (b'', b'sets', 10000, b'number of key sets'), |
1877 (b'', b'sets', 10000, b'number of key sets'), |
1875 (b'', b'mixed', 10000, b'number of mixed mode operations'), |
1878 (b'', b'mixed', 10000, b'number of mixed mode operations'), |
1876 (b'', b'mixedgetfreq', 50, b'frequency of get vs set ops in mixed mode')], |
1879 (b'', b'mixedgetfreq', 50, b'frequency of get vs set ops in mixed mode')], |
1877 norepo=True) |
1880 norepo=True) |
1878 def perflrucache(ui, size=4, gets=10000, sets=10000, mixed=10000, |
1881 def perflrucache(ui, mincost=0, maxcost=100, costlimit=0, size=4, |
1879 mixedgetfreq=50, **opts): |
1882 gets=10000, sets=10000, mixed=10000, mixedgetfreq=50, **opts): |
1880 def doinit(): |
1883 def doinit(): |
1881 for i in xrange(10000): |
1884 for i in xrange(10000): |
1882 util.lrucachedict(size) |
1885 util.lrucachedict(size) |
|
1886 |
|
1887 costrange = list(range(mincost, maxcost + 1)) |
1883 |
1888 |
1884 values = [] |
1889 values = [] |
1885 for i in xrange(size): |
1890 for i in xrange(size): |
1886 values.append(random.randint(0, sys.maxint)) |
1891 values.append(random.randint(0, sys.maxint)) |
1887 |
1892 |
1897 d[v] = v |
1902 d[v] = v |
1898 for key in getseq: |
1903 for key in getseq: |
1899 value = d[key] |
1904 value = d[key] |
1900 value # silence pyflakes warning |
1905 value # silence pyflakes warning |
1901 |
1906 |
|
1907 def dogetscost(): |
|
1908 d = util.lrucachedict(size, maxcost=costlimit) |
|
1909 for i, v in enumerate(values): |
|
1910 d.insert(v, v, cost=costs[i]) |
|
1911 for key in getseq: |
|
1912 try: |
|
1913 value = d[key] |
|
1914 value # silence pyflakes warning |
|
1915 except KeyError: |
|
1916 pass |
|
1917 |
1902 # Set mode tests insertion speed with cache eviction. |
1918 # Set mode tests insertion speed with cache eviction. |
1903 setseq = [] |
1919 setseq = [] |
|
1920 costs = [] |
1904 for i in xrange(sets): |
1921 for i in xrange(sets): |
1905 setseq.append(random.randint(0, sys.maxint)) |
1922 setseq.append(random.randint(0, sys.maxint)) |
|
1923 costs.append(random.choice(costrange)) |
1906 |
1924 |
1907 def doinserts(): |
1925 def doinserts(): |
1908 d = util.lrucachedict(size) |
1926 d = util.lrucachedict(size) |
1909 for v in setseq: |
1927 for v in setseq: |
1910 d.insert(v, v) |
1928 d.insert(v, v) |
|
1929 |
|
1930 def doinsertscost(): |
|
1931 d = util.lrucachedict(size, maxcost=costlimit) |
|
1932 for i, v in enumerate(setseq): |
|
1933 d.insert(v, v, cost=costs[i]) |
1911 |
1934 |
1912 def dosets(): |
1935 def dosets(): |
1913 d = util.lrucachedict(size) |
1936 d = util.lrucachedict(size) |
1914 for v in setseq: |
1937 for v in setseq: |
1915 d[v] = v |
1938 d[v] = v |
1921 if r < mixedgetfreq: |
1944 if r < mixedgetfreq: |
1922 op = 0 |
1945 op = 0 |
1923 else: |
1946 else: |
1924 op = 1 |
1947 op = 1 |
1925 |
1948 |
1926 mixedops.append((op, random.randint(0, size * 2))) |
1949 mixedops.append((op, |
|
1950 random.randint(0, size * 2), |
|
1951 random.choice(costrange))) |
1927 |
1952 |
1928 def domixed(): |
1953 def domixed(): |
1929 d = util.lrucachedict(size) |
1954 d = util.lrucachedict(size) |
1930 |
1955 |
1931 for op, v in mixedops: |
1956 for op, v, cost in mixedops: |
1932 if op == 0: |
1957 if op == 0: |
1933 try: |
1958 try: |
1934 d[v] |
1959 d[v] |
1935 except KeyError: |
1960 except KeyError: |
1936 pass |
1961 pass |
1937 else: |
1962 else: |
1938 d[v] = v |
1963 d[v] = v |
1939 |
1964 |
|
1965 def domixedcost(): |
|
1966 d = util.lrucachedict(size, maxcost=costlimit) |
|
1967 |
|
1968 for op, v, cost in mixedops: |
|
1969 if op == 0: |
|
1970 try: |
|
1971 d[v] |
|
1972 except KeyError: |
|
1973 pass |
|
1974 else: |
|
1975 d.insert(v, v, cost=cost) |
|
1976 |
1940 benches = [ |
1977 benches = [ |
1941 (doinit, b'init'), |
1978 (doinit, b'init'), |
1942 (dogets, b'gets'), |
|
1943 (doinserts, b'inserts'), |
|
1944 (dosets, b'sets'), |
|
1945 (domixed, b'mixed') |
|
1946 ] |
1979 ] |
|
1980 |
|
1981 if costlimit: |
|
1982 benches.extend([ |
|
1983 (dogetscost, b'gets w/ cost limit'), |
|
1984 (doinsertscost, b'inserts w/ cost limit'), |
|
1985 (domixedcost, b'mixed w/ cost limit'), |
|
1986 ]) |
|
1987 else: |
|
1988 benches.extend([ |
|
1989 (dogets, b'gets'), |
|
1990 (doinserts, b'inserts'), |
|
1991 (dosets, b'sets'), |
|
1992 (domixed, b'mixed') |
|
1993 ]) |
1947 |
1994 |
1948 for fn, title in benches: |
1995 for fn, title in benches: |
1949 timer, fm = gettimer(ui, opts) |
1996 timer, fm = gettimer(ui, opts) |
1950 timer(fn, title=title) |
1997 timer(fn, title=title) |
1951 fm.end() |
1998 fm.end() |