Title: [196292] trunk/PerformanceTests
Revision
196292
Author
jon...@apple.com
Date
2016-02-08 19:30:29 -0800 (Mon, 08 Feb 2016)

Log Message

Adjust the FPS graph scale.

Instead of making the FPS graph linearly scale, scale it based on the frame length,
but show the data in terms of FPS. Because it is inversely proportional, and most
of the data never gets below 20, concentrate the axis from 20-60 FPS, since otherwise
over half of the available graph space ends up blank.

This means we should convert all of the FPS data to frame length data.

* Animometer/resources/debug-runner/graph.js: Update the domain to be based on
frame length in milliseconds instead of FPS. Update the cursor to consider all of the
values being shown, and then pick the min and max values to represent the length of the
cursor.
* Animometer/resources/runner/animometer.js:
* Animometer/resources/strings.js:
* Animometer/tests/resources/main.js:
(processSamples): Add the ability to only sample a range of the data instead of everything
after an offset index. Update sampler to record the frame lengths instead of the frame
rate.

Modified Paths

Diff

Modified: trunk/PerformanceTests/Animometer/resources/debug-runner/graph.js (196291 => 196292)


--- trunk/PerformanceTests/Animometer/resources/debug-runner/graph.js	2016-02-09 03:30:26 UTC (rev 196291)
+++ trunk/PerformanceTests/Animometer/resources/debug-runner/graph.js	2016-02-09 03:30:29 UTC (rev 196292)
@@ -17,7 +17,7 @@
                 .attr("transform", "translate(" + margins.left + "," + margins.top + ")");
 
         var axes = graphData.axes;
-        var targetFPS = graphData.targetFPS;
+        var targetFrameLength = graphData.targetFrameLength;
 
         // Axis scales
         var x = d3.scale.linear()
@@ -28,7 +28,7 @@
                 .domain([0, d3.max(graphData.samples, function(s) { return s.complexity; })]);
         var yRight = d3.scale.linear()
                 .range([size.height, 0])
-                .domain([0, 60]);
+                .domain([1000/20, 1000/60]);
 
         // Axes
         var xAxis = d3.svg.axis()
@@ -40,6 +40,8 @@
                 .orient("left");
         var yAxisRight = d3.svg.axis()
                 .scale(yRight)
+                .tickValues([1000/20, 1000/25, 1000/30, 1000/35, 1000/40, 1000/45, 1000/50, 1000/55, 1000/60])
+                .tickFormat(function(d) { return (1000/d).toFixed(0); })
                 .orient("right");
 
         // x-axis
@@ -123,12 +125,12 @@
             .attr("class", "right-mean mean");
 
         // right-target
-        if (targetFPS) {
+        if (targetFrameLength) {
             svg.append("line")
                 .attr("x1", x(0))
                 .attr("x2", size.width)
-                .attr("y1", yRight(targetFPS))
-                .attr("y2", yRight(targetFPS))
+                .attr("y1", yRight(targetFrameLength))
+                .attr("y2", yRight(targetFrameLength))
                 .attr("class", "target-fps marker");
         }
 
@@ -143,7 +145,7 @@
         // Data
         var allData = graphData.samples;
         var filteredData = graphData.samples.filter(function (sample) {
-            return "smoothedFPS" in sample;
+            return "smoothedFrameLength" in sample;
         });
 
         function addData(name, data, yCoordinateCallback, pointRadius, omitLine) {
@@ -169,8 +171,8 @@
         }
 
         addData("complexity", allData, function(d) { return yLeft(d.complexity); }, 2);
-        addData("rawFPS", allData, function(d) { return yRight(d.fps); }, 1);
-        addData("filteredFPS", filteredData, function(d) { return yRight(d.smoothedFPS); }, 2);
+        addData("rawFPS", allData, function(d) { return yRight(d.frameLength); }, 1);
+        addData("filteredFPS", filteredData, function(d) { return yRight(d.smoothedFrameLength); }, 2);
 
         // Area to handle mouse events
         var area = svg.append("rect")
@@ -196,12 +198,7 @@
             var data = ""
             var cursor_x = x(data.time);
             var cursor_y = yAxisRight.scale().domain()[1];
-            if (form["rawFPS"].checked)
-                cursor_y = Math.max(cursor_y, data.fps);
-            cursorGroup.select("line")
-                .attr("x1", cursor_x)
-                .attr("x2", cursor_x)
-                .attr("y2", yRight(cursor_y));
+            var ys = [yRight(yAxisRight.scale().domain()[0]), yRight(yAxisRight.scale().domain()[1])];
 
             document.querySelector("#test-graph nav .time").textContent = (data.time / 1000).toFixed(4) + "s (" + index + ")";
             statsToHighlight.forEach(function(name) {
@@ -214,13 +211,13 @@
                     data_y = yLeft(data.complexity);
                     break;
                 case "rawFPS":
-                    content = data.fps.toFixed(2);
-                    data_y = yRight(data.fps);
+                    content = (1000/data.frameLength).toFixed(2);
+                    data_y = yRight(data.frameLength);
                     break;
                 case "filteredFPS":
-                    if ("smoothedFPS" in data) {
-                        content = data.smoothedFPS.toFixed(2);
-                        data_y = yRight(data.smoothedFPS);
+                    if ("smoothedFrameLength" in data) {
+                        content = (1000/data.smoothedFrameLength).toFixed(2);
+                        data_y = yRight(data.smoothedFrameLength);
                     }
                     break;
                 }
@@ -228,6 +225,7 @@
                 element.textContent = content;
 
                 if (form[name].checked && data_y !== null) {
+                    ys.push(data_y);
                     cursorGroup.select("." + name)
                         .attr("cx", cursor_x)
                         .attr("cy", data_y);
@@ -235,6 +233,15 @@
                 } else
                     document.querySelector("#cursor ." + name).classList.add("hidden");
             });
+
+            if (form["rawFPS"].checked)
+                cursor_y = Math.max(cursor_y, data.frameLength);
+            cursorGroup.select("line")
+                .attr("x1", cursor_x)
+                .attr("x2", cursor_x)
+                .attr("y1", Math.min.apply(null, ys))
+                .attr("y2", Math.max.apply(null, ys));
+
         });
         this.onGraphOptionsChanged();
     },

Modified: trunk/PerformanceTests/Animometer/resources/runner/animometer.js (196291 => 196292)


--- trunk/PerformanceTests/Animometer/resources/runner/animometer.js	2016-02-09 03:30:26 UTC (rev 196291)
+++ trunk/PerformanceTests/Animometer/resources/runner/animometer.js	2016-02-09 03:30:29 UTC (rev 196292)
@@ -123,13 +123,13 @@
                 axes: [Strings.text.experiments.complexity, Strings.text.experiments.frameRate],
                 mean: [
                     testResults[Strings.json.experiments.complexity][Strings.json.measurements.average],
-                    testResults[Strings.json.experiments.frameRate][Strings.json.measurements.average]
+                    1000 / testResults[Strings.json.experiments.frameRate][Strings.json.measurements.average]
                 ],
                 samples: data,
                 marks: testResults[Strings.json.marks]
             }
-            if (testResults[Strings.json.targetFPS])
-                graphData.targetFPS = testResults[Strings.json.targetFPS];
+            if (testResults[Strings.json.targetFrameLength])
+                graphData.targetFrameLength = testResults[Strings.json.targetFrameLength];
             benchmarkController.showTestGraph(testName, score, mean, graphData);
         });
 

Modified: trunk/PerformanceTests/Animometer/resources/strings.js (196291 => 196292)


--- trunk/PerformanceTests/Animometer/resources/strings.js	2016-02-09 03:30:26 UTC (rev 196291)
+++ trunk/PerformanceTests/Animometer/resources/strings.js	2016-02-09 03:30:29 UTC (rev 196292)
@@ -27,8 +27,9 @@
         samples: "samples",
         marks: "marks",
 
-        targetFPS: "targetFPS",
-        samplingTimeOffset: "samplingTimeOffset",
+        targetFrameLength: "targetFrameLength",
+        samplingStartTimeOffset: "Start sampling",
+        samplingEndTimeOffset: "End sampling",
 
         experiments: {
             complexity: "complexity",

Modified: trunk/PerformanceTests/Animometer/tests/resources/main.js (196291 => 196292)


--- trunk/PerformanceTests/Animometer/tests/resources/main.js	2016-02-09 03:30:26 UTC (rev 196291)
+++ trunk/PerformanceTests/Animometer/tests/resources/main.js	2016-02-09 03:30:29 UTC (rev 196292)
@@ -23,7 +23,7 @@
     recordFirstSample: function(stage, startTimestamp)
     {
         this._sampler.record(startTimestamp, stage.complexity(), -1);
-        this.mark(Strings.json.samplingTimeOffset, startTimestamp);
+        this.mark(Strings.json.samplingStartTimeOffset, startTimestamp);
     },
 
     mark: function(comment, timestamp, data) {
@@ -40,7 +40,7 @@
     update: function(stage, timestamp)
     {
         this._estimator.sample(timestamp - this._sampler.samples[0][this._sampler.sampleCount - 1]);
-        this._sampler.record(timestamp, stage.complexity(), 1000 / this._estimator.estimate);
+        this._sampler.record(timestamp, stage.complexity(), this._estimator.estimate);
     },
 
     shouldStop: function(timestamp)
@@ -56,16 +56,15 @@
     processSamples: function(results)
     {
         var complexityExperiment = new Experiment;
-        var smoothedFPSExperiment = new Experiment;
+        var smoothedFrameLengthExperiment = new Experiment;
 
         var samples = this._sampler.samples;
 
-        var samplingIndex = 0;
-        var samplingMark = this._marks[Strings.json.samplingTimeOffset];
-        if (samplingMark) {
-            samplingIndex = samplingMark.index;
-            results[Strings.json.samplingTimeOffset] = samplingMark.time;
-        }
+        var samplingStartIndex = 0, samplingEndIndex = -1;
+        if (Strings.json.samplingStartTimeOffset in this._marks)
+            samplingStartIndex = this._marks[Strings.json.samplingStartTimeOffset].index;
+        if (Strings.json.samplingEndTimeOffset in this._marks)
+            samplingEndIndex = this._marks[Strings.json.samplingEndTimeOffset].index;
 
         for (var markName in this._marks)
             this._marks[markName].time -= this._startTimestamp;
@@ -73,25 +72,24 @@
 
         results[Strings.json.samples] = samples[0].map(function(timestamp, i) {
             var result = {
-                // Represent time in seconds
+                // Represent time in milliseconds
                 time: timestamp - this._startTimestamp,
                 complexity: samples[1][i]
             };
 
-            // time offsets represented as FPS
             if (i == 0)
-                result.fps = 60;
+                result.frameLength = 1000/60;
             else
-                result.fps = 1000 / (timestamp - samples[0][i - 1]);
+                result.frameLength = timestamp - samples[0][i - 1];
 
             if (samples[2][i] != -1)
-                result.smoothedFPS = samples[2][i];
+                result.smoothedFrameLength = samples[2][i];
 
             // Don't start adding data to the experiments until we reach the sampling timestamp
-            if (i >= samplingIndex) {
+            if (i >= samplingStartIndex && (samplingEndIndex == -1 || i < samplingEndIndex)) {
                 complexityExperiment.sample(result.complexity);
-                if (result.smoothedFPS && result.smoothedFPS != -1)
-                    smoothedFPSExperiment.sample(result.smoothedFPS);
+                if (result.smoothedFrameLength && result.smoothedFrameLength != -1)
+                    smoothedFrameLengthExperiment.sample(result.smoothedFrameLength);
             }
 
             return result;
@@ -106,12 +104,12 @@
         complexityResults[Strings.json.measurements.stdev] = complexityExperiment.standardDeviation();
         complexityResults[Strings.json.measurements.percent] = complexityExperiment.percentage();
 
-        var smoothedFPSResults = {};
-        results[Strings.json.experiments.frameRate] = smoothedFPSResults;
-        smoothedFPSResults[Strings.json.measurements.average] = smoothedFPSExperiment.mean();
-        smoothedFPSResults[Strings.json.measurements.concern] = smoothedFPSExperiment.concern(Experiment.defaults.CONCERN);
-        smoothedFPSResults[Strings.json.measurements.stdev] = smoothedFPSExperiment.standardDeviation();
-        smoothedFPSResults[Strings.json.measurements.percent] = smoothedFPSExperiment.percentage();
+        var smoothedFrameLengthResults = {};
+        results[Strings.json.experiments.frameRate] = smoothedFrameLengthResults;
+        smoothedFrameLengthResults[Strings.json.measurements.average] = 1000 / smoothedFrameLengthExperiment.mean();
+        smoothedFrameLengthResults[Strings.json.measurements.concern] = smoothedFrameLengthExperiment.concern(Experiment.defaults.CONCERN);
+        smoothedFrameLengthResults[Strings.json.measurements.stdev] = smoothedFrameLengthExperiment.standardDeviation();
+        smoothedFrameLengthResults[Strings.json.measurements.percent] = smoothedFrameLengthExperiment.percentage();
     }
 });
 
@@ -156,7 +154,7 @@
     {
         if (!this._startedSampling && timestamp > this._samplingTimestamp) {
             this._startedSampling = true;
-            this.mark(Strings.json.samplingTimeOffset, this._samplingTimestamp);
+            this.mark(Strings.json.samplingStartTimeOffset, this._samplingTimestamp);
         }
 
         // Start the work for the next frame.
@@ -175,7 +173,7 @@
         tuneValue = tuneValue > 0 ? Math.floor(tuneValue) : Math.ceil(tuneValue);
         stage.tune(tuneValue);
 
-        this._sampler.record(timestamp, stage.complexity(), intervalEstimatedFrameRate);
+        this._sampler.record(timestamp, stage.complexity(), this._estimator.estimate);
 
         // Start the next interval.
         this._intervalFrameCount = 0;
@@ -185,7 +183,7 @@
     processSamples: function(results)
     {
         Controller.prototype.processSamples.call(this, results);
-        results[Strings.json.targetFPS] = this._targetFrameRate;
+        results[Strings.json.targetFrameLength] = 1000 / this._targetFrameRate;
     }
 });
 

Modified: trunk/PerformanceTests/ChangeLog (196291 => 196292)


--- trunk/PerformanceTests/ChangeLog	2016-02-09 03:30:26 UTC (rev 196291)
+++ trunk/PerformanceTests/ChangeLog	2016-02-09 03:30:29 UTC (rev 196292)
@@ -1,5 +1,27 @@
 2016-02-07  Jon Lee  <jon...@apple.com>
 
+        Adjust the FPS graph scale.
+
+        Instead of making the FPS graph linearly scale, scale it based on the frame length,
+        but show the data in terms of FPS. Because it is inversely proportional, and most
+        of the data never gets below 20, concentrate the axis from 20-60 FPS, since otherwise
+        over half of the available graph space ends up blank.
+
+        This means we should convert all of the FPS data to frame length data.
+
+        * Animometer/resources/debug-runner/graph.js: Update the domain to be based on
+        frame length in milliseconds instead of FPS. Update the cursor to consider all of the
+        values being shown, and then pick the min and max values to represent the length of the
+        cursor.
+        * Animometer/resources/runner/animometer.js:
+        * Animometer/resources/strings.js:
+        * Animometer/tests/resources/main.js:
+        (processSamples): Add the ability to only sample a range of the data instead of everything
+        after an offset index. Update sampler to record the frame lengths instead of the frame
+        rate.
+
+2016-02-07  Jon Lee  <jon...@apple.com>
+
         Add option to use different methods for retrieving a timestamp.
 
         * Animometer/developer.html: Add performance.now and Date.now options.
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to