-
Notifications
You must be signed in to change notification settings - Fork 22
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
lots of random files I hadn't committed
- Loading branch information
Showing
15 changed files
with
1,568 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||
golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= | ||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= | ||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||
golang.org/x/tools v0.0.0-20200815165600-90abf76919f3 h1:0aScV/0rLmANzEYIhjCOi2pTvDyhZNduBUMD2q3iqs4= | ||
golang.org/x/tools v0.0.0-20200815165600-90abf76919f3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= | ||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= | ||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
#!/usr/bin/env python3 | ||
# -*- python -*- | ||
|
||
# Copyright 2015 The Go Authors. All rights reserved. | ||
# Use of this source code is governed by a BSD-style | ||
# license that can be found in the LICENSE file. | ||
|
||
import argparse | ||
import os | ||
import datetime | ||
|
||
import numpy as np | ||
import scipy.stats as stats | ||
import pandas as pd | ||
|
||
import matplotlib as mpl | ||
mpl.use('GTK3Cairo') | ||
mpl.rc('figure', facecolor='1') | ||
import matplotlib.pyplot as plt | ||
import matplotlib.dates as mdates | ||
import seaborn as sns | ||
|
||
# TODO: Take a rev-list and work from that instead. Then there can be | ||
# benchmarks mixed in from other branches, and it will be much easier | ||
# to specify a baseline. | ||
|
||
def main(): | ||
argp = argparse.ArgumentParser( | ||
description='''Plot benchmarks over time.''') | ||
argp.add_argument('--baseline', action='append', type=argparse.FileType(), | ||
help='''Benchmark output files to use as a baseline.''') | ||
argp.add_argument('benchout', nargs='+', type=argparse.FileType(), | ||
help='''Benchmark output files to read. Must be in | ||
directories named YYYY-MM-DDTHH:MM:SS.''') | ||
args = argp.parse_args() | ||
|
||
baseline = None | ||
baselineNames = set() | ||
if args.baseline: | ||
baseline = pd.DataFrame() | ||
for benchout in args.baseline: | ||
b1 = parseBenchmarks(benchout) | ||
b1['date'] = dateOf(benchout.name) | ||
baseline = baseline.append(b1, ignore_index=True) | ||
baselineNames.add(benchout.name) | ||
|
||
print(args.baseline, baselineNames) | ||
benchmarks = pd.DataFrame() | ||
for benchout in args.benchout: | ||
if benchout.name in baselineNames: | ||
continue | ||
if '2015-02-18' in benchout.name: | ||
continue # XXX | ||
if '2015-05-05T10:38:48-04:00' in benchout.name: | ||
# XXX Off-master commit | ||
continue | ||
b1 = parseBenchmarks(benchout) | ||
b1['date'] = dateOf(benchout.name) | ||
benchmarks = benchmarks.append(b1, ignore_index=True) | ||
|
||
benchMeans = getBenchMeans(benchmarks) | ||
gmeanByDate = gmeanBenchmarks(benchMeans) | ||
|
||
for i, (gmean1, gmean2) in enumerate(zip(gmeanByDate['ops/sec'], gmeanByDate['ops/sec'][1:])): | ||
delta = (gmean2 - gmean1) / gmean1 | ||
if abs(delta) > 0.05: | ||
date = gmeanByDate['date'][i+1] | ||
print("%s %s %+g%%" % (shaOfDate(date), date, delta*100)) | ||
|
||
if baseline is not None: | ||
# Normalize each date geomean to baseline | ||
# | ||
# XXX Should this just add a line? | ||
baselineGmean = stats.gmean(getBenchMeans(baseline)['ops/sec']) | ||
gmeanByDate['normalized ops/sec'] = gmeanByDate['ops/sec'] / baselineGmean | ||
plotCol = 'normalized ops/sec' | ||
else: | ||
plotCol = 'ops/sec' | ||
|
||
# # Normalize each benchmark to latest result. | ||
# latestBenchMeans = benchMeans.sort('date', ascending=False).groupby('name').\ | ||
# head(1).reset_index(drop=True) | ||
# latestBenchMeans = latestBenchMeans.drop('date', 1).set_index('name') | ||
# print(latestBenchMeans) | ||
# # normBenchMeans = benchMeans.drop('date').groupby('name'). | ||
|
||
fig, ax = plt.subplots(1, 1, dpi=120) | ||
|
||
ax.set_title('go1 benchmarks relative to Go 1.4') # XXX | ||
ax.plot(gmeanByDate['date'].astype(datetime.datetime), gmeanByDate[plotCol]) | ||
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %e')) | ||
ax.format_xdata = mdates.DateFormatter('%Y-%m-%dT%H:%M:%S') | ||
ax.set_ylim(bottom=0) | ||
ax.set_ylabel('Geomean performance (%s)' % plotCol) | ||
#fig.autofmt_xdate() | ||
fig.tight_layout() | ||
plt.show() | ||
|
||
def getBenchMeans(benchmarks): | ||
# Compute ops/sec | ||
benchmarks['ops/sec'] = 1e9 / benchmarks['ns/op'] | ||
|
||
# Compute the mean for each benchmark. | ||
# TODO: Discard outliers. | ||
return benchmarks.groupby(['date', 'name']).mean().reset_index() | ||
|
||
def gmeanBenchmarks(benchMeans): | ||
# For each date, compute the geometric mean across benchmarks. | ||
return benchMeans.groupby('date')['ops/sec'].agg(stats.gmean).reset_index() | ||
|
||
def parseBenchmarks(fp): | ||
results = [] | ||
for line in fp: | ||
f = line.split() | ||
if len(f) < 4: | ||
continue | ||
name = f[0] | ||
ns = None | ||
for i, field in enumerate(f): | ||
if field == 'ns/op': | ||
ns = float(f[i-1]) | ||
if ns is None: | ||
continue | ||
|
||
results.append((name, ns)) | ||
|
||
# UGH. This doesn't work if results == [] | ||
return pd.DataFrame(results, | ||
columns=('name', 'ns/op')) | ||
|
||
def dateOf(path): | ||
p = os.path.basename(os.path.dirname(path)) | ||
if p.endswith('-04:00'): | ||
p = p[:-len('-04:00')] # XXX | ||
return datetime.datetime.strptime(p, '%Y-%m-%dT%H:%M:%S') | ||
|
||
def shaOfDate(date): | ||
d = date.strftime('%Y-%m-%dT%H:%M:%S') | ||
return os.path.basename(os.readlink('history/by-date/' + d)) | ||
|
||
if __name__ == '__main__': | ||
main() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,146 @@ | ||
#!/usr/bin/env python3 | ||
# -*- python -*- | ||
|
||
# Copyright 2015 The Go Authors. All rights reserved. | ||
# Use of this source code is governed by a BSD-style | ||
# license that can be found in the LICENSE file. | ||
|
||
import argparse | ||
import os | ||
import datetime | ||
|
||
import numpy as np | ||
import scipy.stats as stats | ||
import pandas as pd | ||
|
||
import matplotlib as mpl | ||
mpl.use('GTK3Cairo') | ||
mpl.rc('figure', facecolor='1') | ||
import matplotlib.pyplot as plt | ||
import seaborn as sns | ||
|
||
# TODO: Take a rev-list and work from that instead. Then there can be | ||
# benchmarks mixed in from other branches, and it will be much easier | ||
# to specify a baseline. | ||
|
||
def main(): | ||
argp = argparse.ArgumentParser( | ||
description='''Plot benchmarks over time.''') | ||
argp.add_argument('-C', help='''Git directory''') | ||
argp.add_argument('--baseline', metavar='COMMIT', | ||
help='''Normalize results to COMMIT results''') | ||
argp.add_argument('--history', metavar='DIR', default='history', | ||
help='''Directory of benchmark results (default: %(default)s)''') | ||
argp.add_argument('revisions', nargs='*', default=['HEAD'], | ||
help='''Revision range to show''') | ||
args = argp.parse_args() | ||
|
||
global gitDir | ||
gitDir = argp.C | ||
|
||
revisions = gitRevList(*argp.revisions) | ||
baselineRev = None | ||
if argp.baseline: | ||
baselineRev = gitRevParse(argp.baseline) | ||
|
||
# XXX HERE. I should probably just rewrite this mess in Go. | ||
|
||
|
||
baseline = None | ||
baselineNames = set() | ||
if args.baseline: | ||
baseline = pd.DataFrame() | ||
for benchout in args.baseline: | ||
b1 = parseBenchmarks(benchout) | ||
b1['date'] = dateOf(benchout.name) | ||
baseline = baseline.append(b1, ignore_index=True) | ||
baselineNames.add(benchout.name) | ||
|
||
benchmarks = pd.DataFrame() | ||
for benchout in args.benchout: | ||
if benchout.name in baselineNames: | ||
continue | ||
b1 = parseBenchmarks(benchout) | ||
b1['date'] = dateOf(benchout.name) | ||
benchmarks = benchmarks.append(b1, ignore_index=True) | ||
|
||
benchMeans = getBenchMeans(benchmarks) | ||
gmeanByDate = gmeanBenchmarks(benchMeans) | ||
|
||
if baseline is not None: | ||
# Normalize each date geomean to baseline | ||
# | ||
# XXX Should this just add a line? | ||
baselineGmean = stats.gmean(getBenchMeans(baseline)['ops/sec']) | ||
gmeanByDate['normalized ops/sec'] = gmeanByDate['ops/sec'] / baselineGmean | ||
plotCol = 'normalized ops/sec' | ||
else: | ||
plotCol = 'ops/sec' | ||
|
||
# # Normalize each benchmark to latest result. | ||
# latestBenchMeans = benchMeans.sort('date', ascending=False).groupby('name').\ | ||
# head(1).reset_index(drop=True) | ||
# latestBenchMeans = latestBenchMeans.drop('date', 1).set_index('name') | ||
# print(latestBenchMeans) | ||
# # normBenchMeans = benchMeans.drop('date').groupby('name'). | ||
|
||
fig, ax = plt.subplots(1, 1, dpi=120) | ||
|
||
#ax.set_title('go1 benchmarks relative to Go 1.4') # XXX | ||
ax.plot(gmeanByDate['date'].astype(datetime.datetime), gmeanByDate[plotCol]) | ||
ax.set_ylim(bottom=0) | ||
ax.set_ylabel('Geomean performance (%s)' % plotCol) | ||
fig.tight_layout() | ||
plt.show() | ||
|
||
class Rev(collections.namedtuple('commit date')): pass | ||
|
||
def gitRevList(*args): | ||
revs = [] | ||
for line in subprocess.check_call( | ||
['git', 'rev-list', '--format=format:%H %ct'] + args, | ||
stdout=subprocess.PIPE, stdin=subprocess.DEVNULL).splitlines(): | ||
if line.startswith('commit '): | ||
continue | ||
commit, date = line.split() | ||
pdate = datetime.datetime.fromtimestamp(int(date)) | ||
revs.append(Rev(commit, pdate)) | ||
return revs | ||
|
||
def getBenchMeans(benchmarks): | ||
# Compute ops/sec | ||
benchmarks['ops/sec'] = 1e9 / benchmarks['ns/op'] | ||
|
||
# Compute the mean for each benchmark. | ||
# TODO: Discard outliers. | ||
return benchmarks.groupby(['date', 'name']).mean().reset_index() | ||
|
||
def gmeanBenchmarks(benchMeans): | ||
# For each date, compute the geometric mean across benchmarks. | ||
return benchMeans.groupby('date')['ops/sec'].agg(stats.gmean).reset_index() | ||
|
||
def parseBenchmarks(fp): | ||
results = [] | ||
for line in fp: | ||
f = line.split() | ||
if len(f) < 4: | ||
continue | ||
name = f[0] | ||
ns = None | ||
for i, field in enumerate(f): | ||
if field == 'ns/op': | ||
ns = float(f[i-1]) | ||
if ns is None: | ||
continue | ||
|
||
results.append((name, ns)) | ||
|
||
return pd.DataFrame(results, | ||
columns=('name', 'ns/op')) | ||
|
||
def dateOf(path): | ||
p = os.path.basename(os.path.dirname(path)) | ||
return datetime.datetime.strptime(p, '%Y-%m-%dT%H:%M:%S') | ||
|
||
if __name__ == '__main__': | ||
main() |
Oops, something went wrong.