Show results and status before revisions for A/B testing results
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 23 May 2015 00:25:31 +0000 (00:25 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 23 May 2015 00:25:31 +0000 (00:25 +0000)
https://bugs.webkit.org/show_bug.cgi?id=145327

Reviewed by Chris Dumez.

Place the results and the status columns before the columns for revisions.
Also show the absolute difference as well as the relative difference between the averages of A and B.

* public/v2/app.js:
(App.TestGroupPane._populate):
(App.TestGroupPane._computeStatisticalSignificance):
* public/v2/index.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@184806 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Websites/perf.webkit.org/ChangeLog
Websites/perf.webkit.org/public/v2/app.js
Websites/perf.webkit.org/public/v2/index.html

index 161968abdc4640df7533769dba2ad8bd571e5347..55b78f2fcafe4b3aa2b0df1a859f07b8053fe572 100644 (file)
@@ -1,3 +1,18 @@
+2015-05-22  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Show results and status before revisions for A/B testing results
+        https://bugs.webkit.org/show_bug.cgi?id=145327
+
+        Reviewed by Chris Dumez.
+
+        Place the results and the status columns before the columns for revisions.
+        Also show the absolute difference as well as the relative difference between the averages of A and B.
+
+        * public/v2/app.js:
+        (App.TestGroupPane._populate):
+        (App.TestGroupPane._computeStatisticalSignificance):
+        * public/v2/index.html:
+
 2015-05-20  Ryosuke Niwa  <rniwa@webkit.org>
 
         Build fix after r184591.
index 73a8af93d1fc62907f64656e6c53837ffc9a6099..0e3422c38776d0516c20276700c68f29f3c84338 100755 (executable)
@@ -1424,14 +1424,21 @@ App.TestGroupPane = Ember.ObjectProxy.extend({
 
         this.set('configurations', configurations);
 
+        var probabilityFormatter = d3.format('.2p');
         var comparisons = [];
         for (var i = 0; i < configurations.length - 1; i++) {
             var summary1 = configurations[i].summary;
             for (var j = i + 1; j < configurations.length; j++) {
                 var summary2 = configurations[j].summary;
+
+                var valueDelta = testResults.deltaFormatter(summary2.value - summary1.value);
+                var relativeDelta = d3.format('+.2p')((summary2.value - summary1.value) / summary1.value);
+
+                var stat = this._computeStatisticalSignificance(summary1.measuredValues, summary2.measuredValues);
                 comparisons.push({
                     label: summary1.configLetter + ' / ' + summary2.configLetter,
-                    result: this._computeStatisticalSignificance(summary1.measuredValues, summary2.measuredValues)
+                    difference: isNaN(summary1.value) || isNaN(summary2.value) ? 'N/A' : valueDelta + ' (' + relativeDelta + ') ',
+                    result: stat,
                 });
             }
         }
@@ -1448,13 +1455,13 @@ App.TestGroupPane = Ember.ObjectProxy.extend({
         var details = ' (t=' + tFormatter(statistics.t) + ' df=' + tFormatter(statistics.degreesOfFreedom) + ')';
 
         if (!statistics.range[0])
-            return 'Not statistically significant' + details;
+            return 'Not significant' + details;
 
         var lowerLimit = probabilityFormatter(statistics.range[0]);
         if (!statistics.range[1])
-            return 'Statistical significance > ' + lowerLimit + details;
+            return 'Significance > ' + lowerLimit + details;
 
-        return lowerLimit + ' < Statistical significance < ' + probabilityFormatter(statistics.range[1]) + details;
+        return lowerLimit + ' < Significance < ' + probabilityFormatter(statistics.range[1]) + details;
     },
     _updateReferenceChart: function ()
     {
index 30f9d1cff55f7cb941d85836994654de7c1a1b89..cb7f29d0ab1f6ec6b5ab87459f90b82e040f9efd 100755 (executable)
                     <thead>
                         <tr>
                             <td colspan="2">Configuration</td>
+                            <td>Results</td>
+                            <td>Status</td>
                             {{#each repositories}}
                                 <td>{{name}}</td>
                             {{/each}}
-                            <td>Results</td>
-                            <td>Status</td>
                         </tr>
                     </thead>
                     {{#each configurations}}
                         <tbody>
                             <tr>
                                 <td colspan="2">{{label}}</td>
+                                <td>{{difference}}</td>
+                                <td>{{result}}</td>
                                 {{#with ../this}}
                                     {{#each repositories}}
                                         <td></td>
                                     {{/each}}
                                 {{/with}}
-                                <td colspan="2">{{result}}</td>
                             </tr>
                         </tbody>
                     {{/each}}
     </script>
 
     <script type="text/x-handlebars" data-template-name="testGroupRow">
-        {{#each revisionList}}
-            <td>{{this}}</td>
-        {{/each}}
         <td>
             {{#if value}}
-                {{box-plot range=valueRange value=value delta=confidenceIntervalDelta}}
+                {{box-plot range=valueRange value=value delta=delta}}
             {{/if}}
             {{formattedValue}}
         </td>
         <td>
             <a {{bind-attr href=url title=buildLabel}}>{{statusLabel}}</a>
         </td>
+        {{#each revisionList}}
+            <td>{{this}}</td>
+        {{/each}}
     </script>
 
     <script type="text/x-handlebars" data-template-name="testGroupForm">