OLD | NEW |
1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
2 <html> | 2 <html> |
3 <head> | 3 <head> |
4 <title>Telemetry Performance Test Results</title> | 4 <title>Telemetry Performance Test Results</title> |
5 <style type="text/css"> | 5 <style type="text/css"> |
6 | 6 |
7 section { | 7 section { |
8 background: white; | 8 background: white; |
9 padding: 10px; | 9 padding: 10px; |
10 position: relative; | 10 position: relative; |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
242 } | 242 } |
243 | 243 |
244 .closeAllButton:hover { | 244 .closeAllButton:hover { |
245 background: #f04040; | 245 background: #f04040; |
246 } | 246 } |
247 | 247 |
248 </style> | 248 </style> |
249 </head> | 249 </head> |
250 <body onload="init()"> | 250 <body onload="init()"> |
251 <div style="padding: 0 10px; white-space: nowrap;"> | 251 <div style="padding: 0 10px; white-space: nowrap;"> |
252 Result <span id="time-memory" class="checkbox"><span class="checked">Time</span>
<span>Memory</span></span> | 252 Result <span id="time-memory" class="checkbox"></span> |
253 Reference <span id="reference" class="checkbox"></span> | 253 Reference <span id="reference" class="checkbox"></span> |
254 Style <span id="scatter-line" class="checkbox"><span class="checked">Scatter</sp
an><span>Line</span></span> | 254 Style <span id="scatter-line" class="checkbox"><span class="checked">Scatter</sp
an><span>Line</span></span> |
255 <span class="checkbox"><span class="checked" id="undelete">Undelete</span></span
><br> | 255 <span class="checkbox"><span class="checked" id="undelete">Undelete</span></span
><br> |
256 Run your test with --reset-results to clear all runs | 256 Run your test with --reset-results to clear all runs |
257 </div> | 257 </div> |
258 <table id="container"></table> | 258 <table id="container"></table> |
259 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"><
/script> | 259 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"><
/script> |
260 <script> | 260 <script> |
261 %plugins% | 261 %plugins% |
262 </script> | 262 </script> |
263 <script> | 263 <script> |
264 | 264 |
265 var EXPANDED = true; | 265 var EXPANDED = true; |
266 var COLLAPSED = false; | 266 var COLLAPSED = false; |
267 var SMALLEST_PERCENT_DISPLAYED = 0.01; | 267 var SMALLEST_PERCENT_DISPLAYED = 0.01; |
268 var INVISIBLE = false; | 268 var INVISIBLE = false; |
269 var VISIBLE = true; | 269 var VISIBLE = true; |
270 var COMPARISON_SUFFIX = '_compare'; | 270 var COMPARISON_SUFFIX = '_compare'; |
271 var SORT_DOWN_CLASS = 'sortDown'; | 271 var SORT_DOWN_CLASS = 'sortDown'; |
272 var SORT_UP_CLASS = 'sortUp'; | 272 var SORT_UP_CLASS = 'sortUp'; |
273 var BETTER_CLASS = 'better'; | 273 var BETTER_CLASS = 'better'; |
274 var WORSE_CLASS = 'worse'; | 274 var WORSE_CLASS = 'worse'; |
275 var UNKNOWN_CLASS = 'unknown' | 275 var UNKNOWN_CLASS = 'unknown' |
276 // px Indentation for graphs | 276 // px Indentation for graphs |
277 var GRAPH_INDENT = 64; | 277 var GRAPH_INDENT = 64; |
278 var PADDING_UNDER_GRAPH = 5; | 278 var PADDING_UNDER_GRAPH = 5; |
279 // px Indentation for nested children left-margins | 279 // px Indentation for nested children left-margins |
280 var INDENTATION = 40; | 280 var INDENTATION = 40; |
281 // Bit field enums for active test types | |
282 var MEMORY_TEST = 1 << 0; | |
283 var TIME_TEST = 1 << 1; | |
284 var NO_TESTS = 0; | |
285 var ALL_TESTS = MEMORY_TEST | TIME_TEST; | |
286 | 281 |
287 function TestResult(metric, values, associatedRun, std, degreesOfFreedom) { | 282 function TestResult(metric, values, associatedRun, std, degreesOfFreedom) { |
288 if (values) { | 283 if (values) { |
289 if (values[0] instanceof Array) { | 284 if (values[0] instanceof Array) { |
290 var flattenedValues = []; | 285 var flattenedValues = []; |
291 for (var i = 0; i < values.length; i++) | 286 for (var i = 0; i < values.length; i++) |
292 flattenedValues = flattenedValues.concat(values[i]); | 287 flattenedValues = flattenedValues.concat(values[i]); |
293 values = flattenedValues; | 288 values = flattenedValues; |
294 } | 289 } |
295 | 290 |
(...skipping 16 matching lines...) Expand all Loading... |
312 } | 307 } |
313 } | 308 } |
314 catch (e) { | 309 catch (e) { |
315 console.error(e, e.stack); | 310 console.error(e, e.stack); |
316 } | 311 } |
317 } | 312 } |
318 } else { | 313 } else { |
319 values = []; | 314 values = []; |
320 } | 315 } |
321 | 316 |
322 this.test = function () { return metric; } | 317 this.test = function() { return metric; } |
323 this.values = function () { return values.map(function (value) { return metr
ic.scalingFactor() * value; }); } | 318 this.values = function() { return values.map(function(value) { return metric
.scalingFactor() * value; }); } |
324 this.unscaledMean = function () { return Statistics.sum(values) / values.len
gth; } | 319 this.unscaledMean = function() { return Statistics.sum(values) / values.leng
th; } |
325 this.mean = function () { return metric.scalingFactor() * this.unscaledMean(
); } | 320 this.mean = function() { return metric.scalingFactor() * this.unscaledMean()
; } |
326 this.min = function () { return metric.scalingFactor() * Statistics.min(valu
es); } | 321 this.min = function() { return metric.scalingFactor() * Statistics.min(value
s); } |
327 this.max = function () { return metric.scalingFactor() * Statistics.max(valu
es); } | 322 this.max = function() { return metric.scalingFactor() * Statistics.max(value
s); } |
328 this.confidenceIntervalDelta = function () { | 323 this.confidenceIntervalDelta = function() { |
329 if (std !== undefined) { | 324 if (std !== undefined) { |
330 return metric.scalingFactor() * Statistics.confidenceIntervalDeltaFr
omStd(0.95, values.length, | 325 return metric.scalingFactor() * Statistics.confidenceIntervalDeltaFr
omStd(0.95, values.length, |
331 std, degreesOfFreedom); | 326 std, degreesOfFreedom); |
332 } | 327 } |
333 return metric.scalingFactor() * Statistics.confidenceIntervalDelta(0.95,
values.length, | 328 return metric.scalingFactor() * Statistics.confidenceIntervalDelta(0.95,
values.length, |
334 Statistics.sum(values), Statistics.squareSum(values)); | 329 Statistics.sum(values), Statistics.squareSum(values)); |
335 } | 330 } |
336 this.confidenceIntervalDeltaRatio = function () { return this.confidenceInte
rvalDelta() / this.mean(); } | 331 this.confidenceIntervalDeltaRatio = function() { return this.confidenceInter
valDelta() / this.mean(); } |
337 this.percentDifference = function(other) { | 332 this.percentDifference = function(other) { |
338 if (other === undefined) { | 333 if (other === undefined) { |
339 return undefined; | 334 return undefined; |
340 } | 335 } |
341 return (other.unscaledMean() - this.unscaledMean()) / this.unscaledMean(
); | 336 return (other.unscaledMean() - this.unscaledMean()) / this.unscaledMean(
); |
342 } | 337 } |
343 this.isStatisticallySignificant = function (other) { | 338 this.isStatisticallySignificant = function(other) { |
344 if (other === undefined) { | 339 if (other === undefined) { |
345 return false; | 340 return false; |
346 } | 341 } |
347 var diff = Math.abs(other.mean() - this.mean()); | 342 var diff = Math.abs(other.mean() - this.mean()); |
348 return diff > this.confidenceIntervalDelta() && diff > other.confidenceI
ntervalDelta(); | 343 return diff > this.confidenceIntervalDelta() && diff > other.confidenceI
ntervalDelta(); |
349 } | 344 } |
350 this.run = function () { return associatedRun; } | 345 this.run = function() { return associatedRun; } |
351 } | 346 } |
352 | 347 |
353 function TestRun(entry) { | 348 function TestRun(entry) { |
354 this.id = function() { return entry['buildTime'].replace(/[:.-]/g,''); } | 349 this.id = function() { return entry['buildTime'].replace(/[:.-]/g,''); } |
355 this.label = function () { | 350 this.label = function() { |
356 if (labelKey in localStorage) | 351 if (labelKey in localStorage) |
357 return localStorage[labelKey]; | 352 return localStorage[labelKey]; |
358 return entry['label']; | 353 return entry['label']; |
359 } | 354 } |
360 this.setLabel = function(label) { localStorage[labelKey] = label; } | 355 this.setLabel = function(label) { localStorage[labelKey] = label; } |
361 this.isHidden = function() { return localStorage[hiddenKey]; } | 356 this.isHidden = function() { return localStorage[hiddenKey]; } |
362 this.hide = function() { localStorage[hiddenKey] = true; } | 357 this.hide = function() { localStorage[hiddenKey] = true; } |
363 this.show = function() { localStorage.removeItem(hiddenKey); } | 358 this.show = function() { localStorage.removeItem(hiddenKey); } |
364 this.description = function() { | 359 this.description = function() { |
365 return new Date(entry['buildTime']).toLocaleString() + '\n' + entry['pla
tform'] + ' ' + this.label(); | 360 return new Date(entry['buildTime']).toLocaleString() + '\n' + entry['pla
tform'] + ' ' + this.label(); |
(...skipping 22 matching lines...) Expand all Loading... |
388 cachedUnit = 'M ' + unit; | 383 cachedUnit = 'M ' + unit; |
389 } else if (mean > 10 * kilo) { | 384 } else if (mean > 10 * kilo) { |
390 cachedScalingFactor = 1 / kilo; | 385 cachedScalingFactor = 1 / kilo; |
391 cachedUnit = unit == 'ms' ? 's' : ('K ' + unit); | 386 cachedUnit = unit == 'ms' ? 's' : ('K ' + unit); |
392 } else { | 387 } else { |
393 cachedScalingFactor = 1; | 388 cachedScalingFactor = 1; |
394 cachedUnit = unit; | 389 cachedUnit = unit; |
395 } | 390 } |
396 } | 391 } |
397 | 392 |
398 this.name = function () { return name + ':' + metric; } | 393 this.name = function() { return name + ':' + metric; } |
399 this.isImportant = isImportant; | 394 this.isImportant = isImportant; |
400 this.isMemoryTest = function () { | 395 this.isMemoryTest = function() { |
401 return (unit == 'kb' || | 396 return (unit == 'kb' || |
402 unit == 'KB' || | 397 unit == 'KB' || |
403 unit == 'MB' || | 398 unit == 'MB' || |
404 unit == 'bytes' || | 399 unit == 'bytes' || |
405 unit == 'count' || | 400 unit == 'count' || |
406 !metric.indexOf('V8.')); | 401 !metric.indexOf('V8.')); |
407 } | 402 } |
408 this.addResult = function (newResult) { | 403 this.addResult = function(newResult) { |
409 testResults.push(newResult); | 404 testResults.push(newResult); |
410 cachedUnit = null; | 405 cachedUnit = null; |
411 cachedScalingFactor = null; | 406 cachedScalingFactor = null; |
412 } | 407 } |
413 this.results = function () { return testResults; } | 408 this.results = function() { return testResults; } |
414 this.scalingFactor = function() { | 409 this.scalingFactor = function() { |
415 computeScalingFactorIfNeeded(); | 410 computeScalingFactorIfNeeded(); |
416 return cachedScalingFactor; | 411 return cachedScalingFactor; |
417 } | 412 } |
418 this.unit = function () { | 413 this.unit = function() { |
419 computeScalingFactorIfNeeded(); | 414 computeScalingFactorIfNeeded(); |
420 return cachedUnit; | 415 return cachedUnit; |
421 } | 416 } |
422 this.biggerIsBetter = function () { | 417 this.biggerIsBetter = function() { |
423 if (window.unitToBiggerIsBetter == undefined) { | 418 if (window.unitToBiggerIsBetter == undefined) { |
424 window.unitToBiggerIsBetter = {}; | 419 window.unitToBiggerIsBetter = {}; |
425 var units = JSON.parse(document.getElementById('units-json').textCon
tent); | 420 var units = JSON.parse(document.getElementById('units-json').textCon
tent); |
426 for (var u in units) { | 421 for (var u in units) { |
427 if (units[u].improvement_direction == 'up') { | 422 if (units[u].improvement_direction == 'up') { |
428 window.unitToBiggerIsBetter[u] = true; | 423 window.unitToBiggerIsBetter[u] = true; |
429 } | 424 } |
430 } | 425 } |
431 } | 426 } |
432 return window.unitToBiggerIsBetter[unit]; | 427 return window.unitToBiggerIsBetter[unit]; |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 section.children('.plot').css({'width': (100 * test.results().length + 2
5) + 'px', 'height': '300px'}); | 524 section.children('.plot').css({'width': (100 * test.results().length + 2
5) + 'px', 'height': '300px'}); |
530 $(container).append(section); | 525 $(container).append(section); |
531 | 526 |
532 var plotContainer = section.children('.plot'); | 527 var plotContainer = section.children('.plot'); |
533 var minIsZero = true; | 528 var minIsZero = true; |
534 attachPlot(test, plotContainer, minIsZero); | 529 attachPlot(test, plotContainer, minIsZero); |
535 | 530 |
536 attachLinePlots(test, section.children('.line-plots'), useLargeLinePlots
); | 531 attachLinePlots(test, section.children('.line-plots'), useLargeLinePlots
); |
537 | 532 |
538 var tooltip = section.children('.tooltip'); | 533 var tooltip = section.children('.tooltip'); |
539 plotContainer.bind('plothover', function (event, position, item) { | 534 plotContainer.bind('plothover', function(event, position, item) { |
540 if (item) { | 535 if (item) { |
541 var postfix = item.series.id ? ' (' + item.series.id + ')' : ''; | 536 var postfix = item.series.id ? ' (' + item.series.id + ')' : ''; |
542 tooltip.html(item.datapoint[1].toPrecision(4) + postfix); | 537 tooltip.html(item.datapoint[1].toPrecision(4) + postfix); |
543 var sectionOffset = $(section).offset(); | 538 var sectionOffset = $(section).offset(); |
544 tooltip.css({left: item.pageX - sectionOffset.left - tooltip.out
erWidth() / 2, top: item.pageY - sectionOffset.top + 10}); | 539 tooltip.css({left: item.pageX - sectionOffset.left - tooltip.out
erWidth() / 2, top: item.pageY - sectionOffset.top + 10}); |
545 tooltip.fadeIn(200); | 540 tooltip.fadeIn(200); |
546 } else | 541 } else |
547 tooltip.hide(); | 542 tooltip.hide(); |
548 }); | 543 }); |
549 plotContainer.mouseout(function () { | 544 plotContainer.mouseout(function() { |
550 tooltip.hide(); | 545 tooltip.hide(); |
551 }); | 546 }); |
552 plotContainer.click(function (event) { | 547 plotContainer.click(function(event) { |
553 event.preventDefault(); | 548 event.preventDefault(); |
554 minIsZero = !minIsZero; | 549 minIsZero = !minIsZero; |
555 attachPlot(test, plotContainer, minIsZero); | 550 attachPlot(test, plotContainer, minIsZero); |
556 }); | 551 }); |
557 } | 552 } |
558 return section; | 553 return section; |
559 } | 554 } |
560 | 555 |
561 function attachLinePlots(test, container, useLargeLinePlots) { | 556 function attachLinePlots(test, container, useLargeLinePlots) { |
562 var results = test.results(); | 557 var results = test.results(); |
(...skipping 22 matching lines...) Expand all Loading... |
585 var options = $.extend(true, {}, largeLinePlotOptions, | 580 var options = $.extend(true, {}, largeLinePlotOptions, |
586 {yaxis: {min: 0.0, max: maximum}, | 581 {yaxis: {min: 0.0, max: maximum}, |
587 xaxis: {min: 0.0, max: values.length - 1}, | 582 xaxis: {min: 0.0, max: values.length - 1}, |
588 points: {show: (values.length < 2) ? true : fals
e}}); | 583 points: {show: (values.length < 2) ? true : fals
e}}); |
589 } else { | 584 } else { |
590 var options = $.extend(true, {}, linePlotOptions, | 585 var options = $.extend(true, {}, linePlotOptions, |
591 {yaxis: {min: Math.min.apply(Math, values) * 0.9,
max: Math.max.apply(Math, values) * 1.1}, | 586 {yaxis: {min: Math.min.apply(Math, values) * 0.9,
max: Math.max.apply(Math, values) * 1.1}, |
592 xaxis: {min: -0.5, max: values.length - 0.5}, | 587 xaxis: {min: -0.5, max: values.length - 0.5}, |
593 points: {show: (values.length < 2) ? true : fals
e}}); | 588 points: {show: (values.length < 2) ? true : fals
e}}); |
594 } | 589 } |
595 $.plot(container.children().last(), [values.map(function (value, index)
{ return [index, value]; })], options); | 590 $.plot(container.children().last(), [values.map(function(value, index) {
return [index, value]; })], options); |
596 } | 591 } |
597 if (!attachedPlot) | 592 if (!attachedPlot) |
598 container.children().remove(); | 593 container.children().remove(); |
599 } | 594 } |
600 | 595 |
601 function attachHistogramPlots(test, container) { | 596 function attachHistogramPlots(test, container) { |
602 var results = test.results(); | 597 var results = test.results(); |
603 var attachedPlot = false; | 598 var attachedPlot = false; |
604 | 599 |
605 for (var i = 0; i < results.length; i++) { | 600 for (var i = 0; i < results.length; i++) { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 var results = test.results(); | 640 var results = test.results(); |
646 var attachedPlot = false; | 641 var attachedPlot = false; |
647 for (var i = 0; i < results.length; i++) { | 642 for (var i = 0; i < results.length; i++) { |
648 container.append('<div>' + results[i].run().label() + '</div>'); | 643 container.append('<div>' + results[i].run().label() + '</div>'); |
649 } | 644 } |
650 } | 645 } |
651 | 646 |
652 function attachPlot(test, plotContainer, minIsZero) { | 647 function attachPlot(test, plotContainer, minIsZero) { |
653 var results = test.results(); | 648 var results = test.results(); |
654 | 649 |
655 var values = results.reduce(function (values, result, index) { | 650 var values = results.reduce(function(values, result, index) { |
656 var newValues = result.values(); | 651 var newValues = result.values(); |
657 return newValues ? values.concat(newValues.map(function (value) { return
[index, value]; })) : values; | 652 return newValues ? values.concat(newValues.map(function(value) { return
[index, value]; })) : values; |
658 }, []); | 653 }, []); |
659 | 654 |
660 var plotData = [$.extend(true, {}, subpointsPlotOptions, {data: values})]; | 655 var plotData = [$.extend(true, {}, subpointsPlotOptions, {data: values})]; |
661 plotData.push({id: 'μ', data: results.map(function (result, index) { retu
rn [index, result.mean()]; }), color: plotColor}); | 656 plotData.push({id: 'μ', data: results.map(function(result, index) { retur
n [index, result.mean()]; }), color: plotColor}); |
662 | 657 |
663 var overallMax = Statistics.max(results.map(function (result, index) { retur
n result.max(); })); | 658 var overallMax = Statistics.max(results.map(function(result, index) { return
result.max(); })); |
664 var overallMin = Statistics.min(results.map(function (result, index) { retur
n result.min(); })); | 659 var overallMin = Statistics.min(results.map(function(result, index) { return
result.min(); })); |
665 var margin = (overallMax - overallMin) * 0.1; | 660 var margin = (overallMax - overallMin) * 0.1; |
666 var currentPlotOptions = $.extend(true, {}, mainPlotOptions, {yaxis: { | 661 var currentPlotOptions = $.extend(true, {}, mainPlotOptions, {yaxis: { |
667 min: minIsZero ? 0 : overallMin - margin, | 662 min: minIsZero ? 0 : overallMin - margin, |
668 max: minIsZero ? overallMax * 1.1 : overallMax + margin}}); | 663 max: minIsZero ? overallMax * 1.1 : overallMax + margin}}); |
669 | 664 |
670 currentPlotOptions.xaxis.max = results.length - 0.5; | 665 currentPlotOptions.xaxis.max = results.length - 0.5; |
671 currentPlotOptions.xaxis.ticks = results.map(function (result, index) { retu
rn [index, result.run().label()]; }); | 666 currentPlotOptions.xaxis.ticks = results.map(function(result, index) { retur
n [index, result.run().label()]; }); |
672 | 667 |
673 $.plot(plotContainer, plotData, currentPlotOptions); | 668 $.plot(plotContainer, plotData, currentPlotOptions); |
674 } | 669 } |
675 | 670 |
676 function toFixedWidthPrecision(value) { | 671 function toFixedWidthPrecision(value) { |
677 var decimal = value.toFixed(2); | 672 var decimal = value.toFixed(2); |
678 return decimal; | 673 return decimal; |
679 } | 674 } |
680 | 675 |
681 function formatPercentage(fraction) { | 676 function formatPercentage(fraction) { |
682 var percentage = fraction * 100; | 677 var percentage = fraction * 100; |
683 return (fraction * 100).toFixed(2) + '%'; | 678 return (fraction * 100).toFixed(2) + '%'; |
684 } | 679 } |
685 | 680 |
686 function setUpSortClicks(runs) | 681 function setUpSortClicks(runs) |
687 { | 682 { |
688 $('#nameColumn').click(sortByName); | 683 $('#nameColumn').click(sortByName); |
689 | 684 |
690 $('#unitColumn').click(sortByUnit); | 685 $('#unitColumn').click(sortByUnit); |
691 | 686 |
692 runs.forEach(function(run) { | 687 runs.forEach(function(run) { |
693 $('#' + run.id()).click(sortByResult); | 688 $('#' + run.id()).click(sortByResult); |
694 $('#' + run.id() + COMPARISON_SUFFIX).click(sortByReference); | 689 $('#' + run.id() + COMPARISON_SUFFIX).click(sortByReference); |
695 }); | 690 }); |
696 } | 691 } |
697 | 692 |
698 function getTestTypes(tests) { | 693 function TestTypeSelector(tests) { |
699 var testTypes = NO_TESTS; | 694 this.recognizers = { |
700 for (testName in tests) { | 695 'Time': function(test) { return test.isMemoryTest(); }, |
701 if (tests[testName].isMemoryTest()) { | 696 'Memory': function(test) { return !test.isMemoryTest(); } |
702 testTypes |= MEMORY_TEST; | 697 }; |
703 } else { | 698 this.testTypeNames = this.generateUsedTestTypeNames(tests); |
704 testTypes |= TIME_TEST; | 699 // Default to selecting the first test-type name in the list. |
705 } | 700 this.testTypeName = this.testTypeNames[0]; |
706 if (testTypes === ALL_TESTS) { | |
707 // Early out as soon as we've found all the test types. | |
708 break; | |
709 } | |
710 } | |
711 return testTypes; | |
712 } | |
713 | |
714 function areMemoryResultsIgnoredForTestTypes(testTypes) { | |
715 return testTypes !== MEMORY_TEST; | |
716 } | 701 } |
717 | 702 |
718 function setUpUIForTestTypes(testTypes) { | 703 TestTypeSelector.prototype = { |
719 var withFirstTestTypeRemoved = testTypes & (testTypes-1); | 704 set testTypeName(testTypeName) { |
720 if (withFirstTestTypeRemoved === NO_TESTS) { | 705 this._testTypeName = testTypeName; |
721 // Hide button when there are zero or one test types. | 706 this.shouldShowTest = this.recognizers[testTypeName]; |
722 document.getElementById('time-memory').style.display = 'none'; | 707 }, |
| 708 |
| 709 generateUsedTestTypeNames: function(allTests) { |
| 710 var testTypeNames = []; |
| 711 |
| 712 for (var recognizedTestName in this.recognizers) { |
| 713 var recognizes = this.recognizers[recognizedTestName]; |
| 714 for (var testName in allTests) { |
| 715 var test = allTests[testName]; |
| 716 if (recognizes(test)) { |
| 717 testTypeNames.push(recognizedTestName); |
| 718 break; |
| 719 } |
| 720 } |
| 721 } |
| 722 |
| 723 if (testTypeNames.length === 0) { |
| 724 // No test types we recognize, add 'No Results' with a dummy recogni
zer. |
| 725 var noResults = 'No Results'; |
| 726 this.recognizers[noResults] = function() { return false; }; |
| 727 testTypeNames.push(noResults); |
| 728 } else if (testTypeNames.length > 1) { |
| 729 // We have more than one test type, so add 'All' with a recognizer t
hat always succeeds. |
| 730 var allResults = 'All'; |
| 731 this.recognizers[allResults] = function() { return true; }; |
| 732 testTypeNames.push(allResults); |
| 733 } |
| 734 |
| 735 return testTypeNames; |
| 736 }, |
| 737 |
| 738 buildButtonHTMLForUsedTestTypes: function() { |
| 739 var selectedTestTypeName = this._testTypeName; |
| 740 // Build spans for all recognised test names with the selected test high
lighted. |
| 741 return this.testTypeNames.map(function(testTypeName) { |
| 742 var classAttribute = testTypeName === selectedTestTypeName ? ' class
=checked' : ''; |
| 743 return '<span' + classAttribute + '>' + testTypeName + '</span>'; |
| 744 }).join(''); |
723 } | 745 } |
724 } | 746 }; |
725 | 747 |
726 var topLevelRows; | 748 var topLevelRows; |
727 var allTableRows; | 749 var allTableRows; |
728 | 750 |
729 function createTable(tests, runs, shouldIgnoreMemory, referenceIndex, useLargeLi
nePlots) { | 751 function displayTable(tests, runs, testTypeSelector, referenceIndex, useLargeLin
ePlots) { |
730 var resultHeaders = runs.map(function (run, index) { | 752 var resultHeaders = runs.map(function(run, index) { |
731 var header = '<th id="' + run.id() + '" ' + | 753 var header = '<th id="' + run.id() + '" ' + |
732 'colspan=2 ' + | 754 'colspan=2 ' + |
733 'title="' + run.description() + '">' + | 755 'title="' + run.description() + '">' + |
734 '<span class="label" ' + | 756 '<span class="label" ' + |
735 'title="Edit run label">' + | 757 'title="Edit run label">' + |
736 run.label() + | 758 run.label() + |
737 '</span>' + | 759 '</span>' + |
738 '<div class="closeButton" ' + | 760 '<div class="closeButton" ' + |
739 'title="Delete run">' + | 761 'title="Delete run">' + |
740 '×' + | 762 '×' + |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
775 | 797 |
776 $('#container').html(htmlString); | 798 $('#container').html(htmlString); |
777 | 799 |
778 var testNames = []; | 800 var testNames = []; |
779 for (testName in tests) | 801 for (testName in tests) |
780 testNames.push(testName); | 802 testNames.push(testName); |
781 | 803 |
782 allTableRows = []; | 804 allTableRows = []; |
783 testNames.forEach(function(testName) { | 805 testNames.forEach(function(testName) { |
784 var test = tests[testName]; | 806 var test = tests[testName]; |
785 if (test.isMemoryTest() === shouldIgnoreMemory) { | 807 if (testTypeSelector.shouldShowTest(test)) { |
786 return; | 808 allTableRows.push(new TableRow(runs, test, referenceIndex, useLargeL
inePlots)); |
787 } | 809 } |
788 allTableRows.push(new TableRow(runs, test, referenceIndex, useLargeLineP
lots)); | |
789 }); | 810 }); |
790 | 811 |
791 // Build a list of top level rows with attached children | 812 // Build a list of top level rows with attached children |
792 topLevelRows = []; | 813 topLevelRows = []; |
793 allTableRows.forEach(function(row) { | 814 allTableRows.forEach(function(row) { |
794 // Add us to top level if we are a top-level row... | 815 // Add us to top level if we are a top-level row... |
795 if (row.hasNoURL) { | 816 if (row.hasNoURL) { |
796 topLevelRows.push(row); | 817 topLevelRows.push(row); |
797 // Add a duplicate child row that holds the graph for the parent | 818 // Add a duplicate child row that holds the graph for the parent |
798 var graphHolder = new TableRow(runs, row.test, referenceIndex, useLa
rgeLinePlots); | 819 var graphHolder = new TableRow(runs, row.test, referenceIndex, useLa
rgeLinePlots); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
854 $('#labelEditor').focusout(function() { | 875 $('#labelEditor').focusout(function() { |
855 runs[i].setLabel(this.value); | 876 runs[i].setLabel(this.value); |
856 location.reload(); | 877 location.reload(); |
857 }); | 878 }); |
858 $('#labelEditor').keypress(function(event) { | 879 $('#labelEditor').keypress(function(event) { |
859 if (event.which == 13) { | 880 if (event.which == 13) { |
860 runs[i].setLabel(this.value); | 881 runs[i].setLabel(this.value); |
861 location.reload(); | 882 location.reload(); |
862 } | 883 } |
863 }); | 884 }); |
864 $('#labelEditor').click(function (event) { | 885 $('#labelEditor').click(function(event) { |
865 event.stopPropagation(); | 886 event.stopPropagation(); |
866 }); | 887 }); |
867 $('#labelEditor').mousedown(function (event) { | 888 $('#labelEditor').mousedown(function(event) { |
868 event.stopPropagation(); | 889 event.stopPropagation(); |
869 }); | 890 }); |
870 $('#labelEditor').select(); | 891 $('#labelEditor').select(); |
871 break; | 892 break; |
872 } | 893 } |
873 } | 894 } |
874 event.stopPropagation(); | 895 event.stopPropagation(); |
875 }); | 896 }); |
876 } | 897 } |
877 | 898 |
(...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1369 } else { | 1390 } else { |
1370 this.openRow(); | 1391 this.openRow(); |
1371 } | 1392 } |
1372 return false; | 1393 return false; |
1373 } | 1394 } |
1374 | 1395 |
1375 function init() { | 1396 function init() { |
1376 var runs = []; | 1397 var runs = []; |
1377 var metrics = {}; | 1398 var metrics = {}; |
1378 var deletedRunsById = {}; | 1399 var deletedRunsById = {}; |
1379 $.each(JSON.parse(document.getElementById('results-json').textContent), func
tion (index, entry) { | 1400 $.each(JSON.parse(document.getElementById('results-json').textContent), func
tion(index, entry) { |
1380 var run = new TestRun(entry); | 1401 var run = new TestRun(entry); |
1381 if (run.isHidden()) { | 1402 if (run.isHidden()) { |
1382 deletedRunsById[run.id()] = run; | 1403 deletedRunsById[run.id()] = run; |
1383 return; | 1404 return; |
1384 } | 1405 } |
1385 | 1406 |
1386 runs.push(run); | 1407 runs.push(run); |
1387 | 1408 |
1388 function addTests(tests) { | 1409 function addTests(tests) { |
1389 for (var testName in tests) { | 1410 for (var testName in tests) { |
(...skipping 11 matching lines...) Expand all Loading... |
1401 new TestResult(metric, rawMetrics[metricName].current, | 1422 new TestResult(metric, rawMetrics[metricName].current, |
1402 run, rawMetrics[metricName]['std'], rawMetrics[metri
cName]['degrees_of_freedom'])); | 1423 run, rawMetrics[metricName]['std'], rawMetrics[metri
cName]['degrees_of_freedom'])); |
1403 } | 1424 } |
1404 } | 1425 } |
1405 } | 1426 } |
1406 | 1427 |
1407 addTests(entry.tests); | 1428 addTests(entry.tests); |
1408 }); | 1429 }); |
1409 | 1430 |
1410 var useLargeLinePlots = false; | 1431 var useLargeLinePlots = false; |
1411 | |
1412 var testTypes = getTestTypes(metrics); | |
1413 | |
1414 setUpUIForTestTypes(testTypes); | |
1415 var shouldIgnoreMemory = areMemoryResultsIgnoredForTestTypes(testTypes); | |
1416 var referenceIndex = 0; | 1432 var referenceIndex = 0; |
1417 | 1433 |
1418 createTable(metrics, runs, shouldIgnoreMemory, referenceIndex, useLargeLineP
lots); | 1434 var testTypeSelector = new TestTypeSelector(metrics); |
| 1435 var buttonHTML = testTypeSelector.buildButtonHTMLForUsedTestTypes(); |
| 1436 $('#time-memory').append(buttonHTML); |
1419 | 1437 |
1420 $('#time-memory').bind('change', function (event, checkedElement) { | 1438 $('#scatter-line').bind('change', function(event, checkedElement) { |
1421 shouldIgnoreMemory = checkedElement.textContent == 'Time'; | 1439 useLargeLinePlots = checkedElement.textContent == 'Line'; |
1422 createTable(metrics, runs, shouldIgnoreMemory, referenceIndex, useLargeL
inePlots); | 1440 displayTable(metrics, runs, testTypeSelector, referenceIndex, useLargeLi
nePlots); |
1423 }); | 1441 }); |
1424 | 1442 |
1425 $('#scatter-line').bind('change', function (event, checkedElement) { | 1443 runs.map(function(run, index) { |
1426 useLargeLinePlots = checkedElement.textContent == 'Line'; | |
1427 createTable(metrics, runs, shouldIgnoreMemory, referenceIndex, useLargeL
inePlots); | |
1428 }); | |
1429 | |
1430 runs.map(function (run, index) { | |
1431 $('#reference').append('<span value="' + index + '"' + (index == referen
ceIndex ? ' class="checked"' : '') + ' title="' + run.description() + '">' + run
.label() + '</span>'); | 1444 $('#reference').append('<span value="' + index + '"' + (index == referen
ceIndex ? ' class="checked"' : '') + ' title="' + run.description() + '">' + run
.label() + '</span>'); |
1432 }) | 1445 }) |
1433 | 1446 |
1434 $('#reference').bind('change', function (event, checkedElement) { | 1447 $('#time-memory').bind('change', function(event, checkedElement) { |
1435 referenceIndex = parseInt(checkedElement.getAttribute('value')); | 1448 testTypeSelector.testTypeName = checkedElement.textContent; |
1436 createTable(metrics, runs, shouldIgnoreMemory, referenceIndex, useLargeL
inePlots); | 1449 displayTable(metrics, runs, testTypeSelector, referenceIndex, useLargeLi
nePlots); |
1437 }); | 1450 }); |
1438 | 1451 |
1439 $('.checkbox').each(function (index, checkbox) { | 1452 $('#reference').bind('change', function(event, checkedElement) { |
1440 $(checkbox).children('span').click(function (event) { | 1453 referenceIndex = parseInt(checkedElement.getAttribute('value')); |
| 1454 displayTable(metrics, runs, testTypeSelector, referenceIndex, useLargeLi
nePlots); |
| 1455 }); |
| 1456 |
| 1457 displayTable(metrics, runs, testTypeSelector, referenceIndex, useLargeLinePl
ots); |
| 1458 |
| 1459 $('.checkbox').each(function(index, checkbox) { |
| 1460 $(checkbox).children('span').click(function(event) { |
1441 if ($(this).hasClass('checked')) | 1461 if ($(this).hasClass('checked')) |
1442 return; | 1462 return; |
1443 $(checkbox).children('span').removeClass('checked'); | 1463 $(checkbox).children('span').removeClass('checked'); |
1444 $(this).addClass('checked'); | 1464 $(this).addClass('checked'); |
1445 $(checkbox).trigger('change', $(this)); | 1465 $(checkbox).trigger('change', $(this)); |
1446 }); | 1466 }); |
1447 }); | 1467 }); |
1448 | 1468 |
1449 runToUndelete = deletedRunsById[undeleteManager.mostRecentlyDeletedId()]; | 1469 runToUndelete = deletedRunsById[undeleteManager.mostRecentlyDeletedId()]; |
1450 | 1470 |
1451 if (runToUndelete) { | 1471 if (runToUndelete) { |
1452 $('#undelete').html('Undelete ' + runToUndelete.label()); | 1472 $('#undelete').html('Undelete ' + runToUndelete.label()); |
1453 $('#undelete').attr('title', runToUndelete.description()); | 1473 $('#undelete').attr('title', runToUndelete.description()); |
1454 $('#undelete').click(function (event) { | 1474 $('#undelete').click(function(event) { |
1455 runToUndelete.show(); | 1475 runToUndelete.show(); |
1456 undeleteManager.undeleteMostRecent(); | 1476 undeleteManager.undeleteMostRecent(); |
1457 location.reload(); | 1477 location.reload(); |
1458 }); | 1478 }); |
1459 } else { | 1479 } else { |
1460 $('#undelete').hide(); | 1480 $('#undelete').hide(); |
1461 } | 1481 } |
1462 } | 1482 } |
1463 | 1483 |
1464 </script> | 1484 </script> |
1465 <script id="results-json" type="application/json">%json_results%</script> | 1485 <script id="results-json" type="application/json">%json_results%</script> |
1466 <script id="units-json" type="application/json">%json_units%</script> | 1486 <script id="units-json" type="application/json">%json_units%</script> |
1467 </body> | 1487 </body> |
1468 </html> | 1488 </html> |
OLD | NEW |