Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions codespeed/results.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ def validate_result(item):
'benchmark',
'environment',
'result_value',
'source',
]

error = True
Expand All @@ -41,7 +42,7 @@ def validate_result(item):
elif key in item and item[key] == "":
return 'Value for key "' + key + '" empty in request', error

if 'source' in item and item['source'] not in dict(Benchmark.S_TYPES):
if item['source'] not in dict(Benchmark.S_TYPES):
return 'Invalid source "%s"' % item['source'], error

try:
Expand Down Expand Up @@ -73,9 +74,8 @@ def save_result(data, update_repo=True):
p, created = Project.objects.get_or_create(name=data["project"])
branch, created = Branch.objects.get_or_create(name=data["branch"],
project=p)
source = data.get("source", "legacy")
b, created = Benchmark.objects.get_or_create(
name=data["benchmark"], source=source)
name=data["benchmark"], source=data["source"])

if created:
if "description" in data:
Expand Down
26 changes: 17 additions & 9 deletions codespeed/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ def setUp(self):
'benchmark': 'float',
'environment': 'Dual Core',
'result_value': 456,
'source': 'legacy',
}

def test_add_correct_result(self):
Expand Down Expand Up @@ -190,11 +191,13 @@ def test_source_set_on_new_benchmark(self):
b = Benchmark.objects.get(name='newbench')
self.assertEqual(b.source, 'pyperformance')

def test_source_defaults_to_legacy(self):
"""A payload without a source creates a 'legacy' Benchmark"""
self.client.post(self.path, self.data)
b = Benchmark.objects.get(name='float')
self.assertEqual(b.source, 'legacy')
def test_missing_source_rejected(self):
"""A payload without a source is rejected instead of defaulting"""
modified_data = copy.deepcopy(self.data)
del modified_data['source']
response = self.client.post(self.path, modified_data)
self.assertEqual(response.status_code, 400)
self.assertFalse(Benchmark.objects.filter(name='float').exists())

def test_same_name_different_source_are_distinct(self):
"""The same name in a different suite is a separate Benchmark"""
Expand Down Expand Up @@ -245,28 +248,32 @@ def setUp(self):
'executable': 'pypy-c',
'benchmark': 'Richards',
'environment': 'bigdog',
'result_value': 456},
'result_value': 456,
'source': 'legacy'},
{'commitid': '456',
'project': 'pypy',
'branch': 'default',
'executable': 'pypy-c',
'benchmark': 'Richards',
'environment': 'bigdog',
'result_value': 457},
'result_value': 457,
'source': 'legacy'},
{'commitid': '456',
'project': 'pypy',
'branch': 'default',
'executable': 'pypy-c',
'benchmark': 'Richards2',
'environment': 'bigdog',
'result_value': 34},
'result_value': 34,
'source': 'legacy'},
{'commitid': '789',
'project': 'pypy',
'branch': 'default',
'executable': 'pypy-c',
'benchmark': 'Richards',
'environment': 'bigdog',
'result_value': 458},
'result_value': 458,
'source': 'legacy'},
]

def test_get_returns_405(self):
Expand Down Expand Up @@ -452,6 +459,7 @@ def setUp(self):
'benchmark': 'float',
'environment': 'Dual Core',
'result_value': 200,
'source': 'legacy',
}
resp = self.client.post(reverse('add-result'),
self.data)
Expand Down
7 changes: 6 additions & 1 deletion codespeed/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,9 @@ def embed_comparison(request):

@require_GET
def gethistoricaldata(request):
data = {'results': {}, 'benchmarks': []}
# 'labels' maps each key in tagged_revs (plus baseline and 'latest') to
# a two-line label [tag, project] for the x axis of the history chart.
data = {'results': {}, 'benchmarks': [], 'labels': {}}
env = Environment.objects.all()
if settings.DEF_ENVIRONMENT:
env = env.get(name=settings.DEF_ENVIRONMENT)
Expand All @@ -134,6 +136,7 @@ def gethistoricaldata(request):
)
rev0 = rev[0]
resname = '{} {}'.format(b['executable'], rev0.tag)
data['labels'][resname] = [rev0.tag, baseline_exe.project.name]
baseline_results.append((resname, Result.objects.filter(
executable=baseline_exe, revision=rev0, environment=env,
benchmark__source='legacy')))
Expand Down Expand Up @@ -165,12 +168,14 @@ def gethistoricaldata(request):
logger.info("no results for '%s' '%s' '%s'" % (str(_default_exe), str(rev), str(env)))
continue
default_results[rev.tag] = res
data['labels'][rev.tag] = [rev.tag, _default_exe.project.name]
data['tagged_revs'] = [rev.tag for rev in all_taggedrevs if rev.tag in default_results]
# Fetch data for latest results
executable = settings.DEF_EXECUTABLES[0]
def_name = executable['name']
def_project = Project.objects.get(name=executable['project'])
default_exe = Executable.objects.get(name=def_name, project=def_project)
data['labels']['latest'] = ['latest', default_exe.project.name]
default_branch = Branch.objects.get(
name=default_exe.project.default_branch,
project=default_exe.project)
Expand Down
1 change: 1 addition & 0 deletions speed_pypy/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@
{'executable': 'cpython', 'revision': '3.11.15'},
]
DEF_EXECUTABLES = [
{'name': 'pypy3.12-jit-64', 'project': 'PyPy3.12'},
{'name': 'pypy3.11-jit-64', 'project': 'PyPy3.11'},
]
DEF_ENVIRONMENT = 'benchmarker2'
Expand Down
6 changes: 4 additions & 2 deletions speed_pypy/templates/embed_comparison.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>PyPy vs CPython benchmark comparison</title>
<style>
html, body { margin: 0; padding: 0; background: transparent; }
html, body { margin: 0; padding: 0; background: transparent; height: 100%; overflow: hidden; }
/* Fill the embedding iframe so the rotated benchmark labels are never
clipped: the host page controls the height via the iframe. */
#baseline-comparison-plot {
position: relative;
width: 100%;
height: 480px;
height: 100vh;
font-family: sans-serif;
}
</style>
Expand Down
10 changes: 6 additions & 4 deletions speed_pypy/templates/home.html
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ <h2>Comparison</h2>
<h3>How fast is {{ default_exe.project }}?</h3>
<iframe src="{% url 'embed-comparison' %}"
title="{{ default_exe.project }} ({{ default_exe }}) vs {{ baseline }} benchmark comparison"
style="border:0;width:100%;height:400px"
style="border:0;width:100%;height:480px"
loading="lazy"></iframe>
<p class="plot-caption">Plot 1: The above plot represents {{ default_exe.project }} ({{ default_exe }}) benchmark times normalized to {{ baseline }}. Smaller is better.</p>
<p>It depends greatly on the type of task being performed. The geometric average of all benchmarks is <span id="geomean"></span> or <strong id="geofaster"></strong> times <em>faster</em> than {{ baseline }}</p>
Expand Down Expand Up @@ -120,9 +120,11 @@ <h3>How has PyPy performance evolved over time?</h3>
geomeans.push(1 / trunk_geomean);
$('#num_of_benchs').html(num_of_benchs);

var ticks2 = [data['baseline']];
for (var i in data['tagged_revs']) { ticks2.push(data['tagged_revs'][i]); }
ticks2.push('latest {{ default_exe.project }}');
// Two-line labels: [tag, project]; fall back to the key itself.
var labelFor = function(key) { return (data['labels'] || {})[key] || key; };
var ticks2 = [labelFor(data['baseline'])];
for (var i in data['tagged_revs']) { ticks2.push(labelFor(data['tagged_revs'][i])); }
ticks2.push(labelFor('latest'));

var wrap2 = document.getElementById('historical-plot');
var canvas2 = document.createElement('canvas');
Expand Down
1 change: 1 addition & 0 deletions tools/pypy/savecpython.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ def save(project, revision, results, options, executable, host, testing=False):
'environment': host,
'result_value': value,
'result_date': current_date,
'source': 'legacy',
}
if res_type == "ComparisonResult":
data['std_dev'] = results['std_changed']
Expand Down
1 change: 1 addition & 0 deletions tools/pypy/saveresults.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ def save(project, revision, results, executable, host, url, testing=False,
'environment': host,
'result_value': value,
'branch': branch,
'source': 'legacy',
}]
if not value:
print("Ignoring skipped result", data)
Expand Down
6 changes: 4 additions & 2 deletions tools/save_multiple_results.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
"executable": "myexe O3 64bits",
"benchmark": "float",
"environment": "Dual Core",
"result_value": 2500.0
"result_value": 2500.0,
"source": "legacy"
},
{
"commitid": "8",
Expand All @@ -27,7 +28,8 @@
"executable": "myexe O3 64bits",
"benchmark": "int",
"environment": "Dual Core",
"result_value": 1100
"result_value": 1100,
"source": "legacy"
}
]

Expand Down
1 change: 1 addition & 0 deletions tools/save_single_result.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
'benchmark': 'float',
'environment': "Dual Core",
'result_value': 4000,
'source': 'legacy', # 'legacy' or 'pyperformance'
}

# Optional fields
Expand Down
Loading