<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[196292] trunk/PerformanceTests</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/196292">196292</a></dd>
<dt>Author</dt> <dd>jonlee@apple.com</dd>
<dt>Date</dt> <dd>2016-02-08 19:30:29 -0800 (Mon, 08 Feb 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>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.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkPerformanceTestsAnimometerresourcesdebugrunnergraphjs">trunk/PerformanceTests/Animometer/resources/debug-runner/graph.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometerresourcesrunneranimometerjs">trunk/PerformanceTests/Animometer/resources/runner/animometer.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometerresourcesstringsjs">trunk/PerformanceTests/Animometer/resources/strings.js</a></li>
<li><a href="#trunkPerformanceTestsAnimometertestsresourcesmainjs">trunk/PerformanceTests/Animometer/tests/resources/main.js</a></li>
<li><a href="#trunkPerformanceTestsChangeLog">trunk/PerformanceTests/ChangeLog</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkPerformanceTestsAnimometerresourcesdebugrunnergraphjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/resources/debug-runner/graph.js (196291 => 196292)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -17,7 +17,7 @@
</span><span class="cx">                 .attr(&quot;transform&quot;, &quot;translate(&quot; + margins.left + &quot;,&quot; + margins.top + &quot;)&quot;);
</span><span class="cx"> 
</span><span class="cx">         var axes = graphData.axes;
</span><del>-        var targetFPS = graphData.targetFPS;
</del><ins>+        var targetFrameLength = graphData.targetFrameLength;
</ins><span class="cx"> 
</span><span class="cx">         // Axis scales
</span><span class="cx">         var x = d3.scale.linear()
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx">                 .domain([0, d3.max(graphData.samples, function(s) { return s.complexity; })]);
</span><span class="cx">         var yRight = d3.scale.linear()
</span><span class="cx">                 .range([size.height, 0])
</span><del>-                .domain([0, 60]);
</del><ins>+                .domain([1000/20, 1000/60]);
</ins><span class="cx"> 
</span><span class="cx">         // Axes
</span><span class="cx">         var xAxis = d3.svg.axis()
</span><span class="lines">@@ -40,6 +40,8 @@
</span><span class="cx">                 .orient(&quot;left&quot;);
</span><span class="cx">         var yAxisRight = d3.svg.axis()
</span><span class="cx">                 .scale(yRight)
</span><ins>+                .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); })
</ins><span class="cx">                 .orient(&quot;right&quot;);
</span><span class="cx"> 
</span><span class="cx">         // x-axis
</span><span class="lines">@@ -123,12 +125,12 @@
</span><span class="cx">             .attr(&quot;class&quot;, &quot;right-mean mean&quot;);
</span><span class="cx"> 
</span><span class="cx">         // right-target
</span><del>-        if (targetFPS) {
</del><ins>+        if (targetFrameLength) {
</ins><span class="cx">             svg.append(&quot;line&quot;)
</span><span class="cx">                 .attr(&quot;x1&quot;, x(0))
</span><span class="cx">                 .attr(&quot;x2&quot;, size.width)
</span><del>-                .attr(&quot;y1&quot;, yRight(targetFPS))
-                .attr(&quot;y2&quot;, yRight(targetFPS))
</del><ins>+                .attr(&quot;y1&quot;, yRight(targetFrameLength))
+                .attr(&quot;y2&quot;, yRight(targetFrameLength))
</ins><span class="cx">                 .attr(&quot;class&quot;, &quot;target-fps marker&quot;);
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -143,7 +145,7 @@
</span><span class="cx">         // Data
</span><span class="cx">         var allData = graphData.samples;
</span><span class="cx">         var filteredData = graphData.samples.filter(function (sample) {
</span><del>-            return &quot;smoothedFPS&quot; in sample;
</del><ins>+            return &quot;smoothedFrameLength&quot; in sample;
</ins><span class="cx">         });
</span><span class="cx"> 
</span><span class="cx">         function addData(name, data, yCoordinateCallback, pointRadius, omitLine) {
</span><span class="lines">@@ -169,8 +171,8 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         addData(&quot;complexity&quot;, allData, function(d) { return yLeft(d.complexity); }, 2);
</span><del>-        addData(&quot;rawFPS&quot;, allData, function(d) { return yRight(d.fps); }, 1);
-        addData(&quot;filteredFPS&quot;, filteredData, function(d) { return yRight(d.smoothedFPS); }, 2);
</del><ins>+        addData(&quot;rawFPS&quot;, allData, function(d) { return yRight(d.frameLength); }, 1);
+        addData(&quot;filteredFPS&quot;, filteredData, function(d) { return yRight(d.smoothedFrameLength); }, 2);
</ins><span class="cx"> 
</span><span class="cx">         // Area to handle mouse events
</span><span class="cx">         var area = svg.append(&quot;rect&quot;)
</span><span class="lines">@@ -196,12 +198,7 @@
</span><span class="cx">             var data = allData[index];
</span><span class="cx">             var cursor_x = x(data.time);
</span><span class="cx">             var cursor_y = yAxisRight.scale().domain()[1];
</span><del>-            if (form[&quot;rawFPS&quot;].checked)
-                cursor_y = Math.max(cursor_y, data.fps);
-            cursorGroup.select(&quot;line&quot;)
-                .attr(&quot;x1&quot;, cursor_x)
-                .attr(&quot;x2&quot;, cursor_x)
-                .attr(&quot;y2&quot;, yRight(cursor_y));
</del><ins>+            var ys = [yRight(yAxisRight.scale().domain()[0]), yRight(yAxisRight.scale().domain()[1])];
</ins><span class="cx"> 
</span><span class="cx">             document.querySelector(&quot;#test-graph nav .time&quot;).textContent = (data.time / 1000).toFixed(4) + &quot;s (&quot; + index + &quot;)&quot;;
</span><span class="cx">             statsToHighlight.forEach(function(name) {
</span><span class="lines">@@ -214,13 +211,13 @@
</span><span class="cx">                     data_y = yLeft(data.complexity);
</span><span class="cx">                     break;
</span><span class="cx">                 case &quot;rawFPS&quot;:
</span><del>-                    content = data.fps.toFixed(2);
-                    data_y = yRight(data.fps);
</del><ins>+                    content = (1000/data.frameLength).toFixed(2);
+                    data_y = yRight(data.frameLength);
</ins><span class="cx">                     break;
</span><span class="cx">                 case &quot;filteredFPS&quot;:
</span><del>-                    if (&quot;smoothedFPS&quot; in data) {
-                        content = data.smoothedFPS.toFixed(2);
-                        data_y = yRight(data.smoothedFPS);
</del><ins>+                    if (&quot;smoothedFrameLength&quot; in data) {
+                        content = (1000/data.smoothedFrameLength).toFixed(2);
+                        data_y = yRight(data.smoothedFrameLength);
</ins><span class="cx">                     }
</span><span class="cx">                     break;
</span><span class="cx">                 }
</span><span class="lines">@@ -228,6 +225,7 @@
</span><span class="cx">                 element.textContent = content;
</span><span class="cx"> 
</span><span class="cx">                 if (form[name].checked &amp;&amp; data_y !== null) {
</span><ins>+                    ys.push(data_y);
</ins><span class="cx">                     cursorGroup.select(&quot;.&quot; + name)
</span><span class="cx">                         .attr(&quot;cx&quot;, cursor_x)
</span><span class="cx">                         .attr(&quot;cy&quot;, data_y);
</span><span class="lines">@@ -235,6 +233,15 @@
</span><span class="cx">                 } else
</span><span class="cx">                     document.querySelector(&quot;#cursor .&quot; + name).classList.add(&quot;hidden&quot;);
</span><span class="cx">             });
</span><ins>+
+            if (form[&quot;rawFPS&quot;].checked)
+                cursor_y = Math.max(cursor_y, data.frameLength);
+            cursorGroup.select(&quot;line&quot;)
+                .attr(&quot;x1&quot;, cursor_x)
+                .attr(&quot;x2&quot;, cursor_x)
+                .attr(&quot;y1&quot;, Math.min.apply(null, ys))
+                .attr(&quot;y2&quot;, Math.max.apply(null, ys));
+
</ins><span class="cx">         });
</span><span class="cx">         this.onGraphOptionsChanged();
</span><span class="cx">     },
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerresourcesrunneranimometerjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/resources/runner/animometer.js (196291 => 196292)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -123,13 +123,13 @@
</span><span class="cx">                 axes: [Strings.text.experiments.complexity, Strings.text.experiments.frameRate],
</span><span class="cx">                 mean: [
</span><span class="cx">                     testResults[Strings.json.experiments.complexity][Strings.json.measurements.average],
</span><del>-                    testResults[Strings.json.experiments.frameRate][Strings.json.measurements.average]
</del><ins>+                    1000 / testResults[Strings.json.experiments.frameRate][Strings.json.measurements.average]
</ins><span class="cx">                 ],
</span><span class="cx">                 samples: data,
</span><span class="cx">                 marks: testResults[Strings.json.marks]
</span><span class="cx">             }
</span><del>-            if (testResults[Strings.json.targetFPS])
-                graphData.targetFPS = testResults[Strings.json.targetFPS];
</del><ins>+            if (testResults[Strings.json.targetFrameLength])
+                graphData.targetFrameLength = testResults[Strings.json.targetFrameLength];
</ins><span class="cx">             benchmarkController.showTestGraph(testName, score, mean, graphData);
</span><span class="cx">         });
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometerresourcesstringsjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/resources/strings.js (196291 => 196292)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -27,8 +27,9 @@
</span><span class="cx">         samples: &quot;samples&quot;,
</span><span class="cx">         marks: &quot;marks&quot;,
</span><span class="cx"> 
</span><del>-        targetFPS: &quot;targetFPS&quot;,
-        samplingTimeOffset: &quot;samplingTimeOffset&quot;,
</del><ins>+        targetFrameLength: &quot;targetFrameLength&quot;,
+        samplingStartTimeOffset: &quot;Start sampling&quot;,
+        samplingEndTimeOffset: &quot;End sampling&quot;,
</ins><span class="cx"> 
</span><span class="cx">         experiments: {
</span><span class="cx">             complexity: &quot;complexity&quot;,
</span></span></pre></div>
<a id="trunkPerformanceTestsAnimometertestsresourcesmainjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/Animometer/tests/resources/main.js (196291 => 196292)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -23,7 +23,7 @@
</span><span class="cx">     recordFirstSample: function(stage, startTimestamp)
</span><span class="cx">     {
</span><span class="cx">         this._sampler.record(startTimestamp, stage.complexity(), -1);
</span><del>-        this.mark(Strings.json.samplingTimeOffset, startTimestamp);
</del><ins>+        this.mark(Strings.json.samplingStartTimeOffset, startTimestamp);
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     mark: function(comment, timestamp, data) {
</span><span class="lines">@@ -40,7 +40,7 @@
</span><span class="cx">     update: function(stage, timestamp)
</span><span class="cx">     {
</span><span class="cx">         this._estimator.sample(timestamp - this._sampler.samples[0][this._sampler.sampleCount - 1]);
</span><del>-        this._sampler.record(timestamp, stage.complexity(), 1000 / this._estimator.estimate);
</del><ins>+        this._sampler.record(timestamp, stage.complexity(), this._estimator.estimate);
</ins><span class="cx">     },
</span><span class="cx"> 
</span><span class="cx">     shouldStop: function(timestamp)
</span><span class="lines">@@ -56,16 +56,15 @@
</span><span class="cx">     processSamples: function(results)
</span><span class="cx">     {
</span><span class="cx">         var complexityExperiment = new Experiment;
</span><del>-        var smoothedFPSExperiment = new Experiment;
</del><ins>+        var smoothedFrameLengthExperiment = new Experiment;
</ins><span class="cx"> 
</span><span class="cx">         var samples = this._sampler.samples;
</span><span class="cx"> 
</span><del>-        var samplingIndex = 0;
-        var samplingMark = this._marks[Strings.json.samplingTimeOffset];
-        if (samplingMark) {
-            samplingIndex = samplingMark.index;
-            results[Strings.json.samplingTimeOffset] = samplingMark.time;
-        }
</del><ins>+        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;
</ins><span class="cx"> 
</span><span class="cx">         for (var markName in this._marks)
</span><span class="cx">             this._marks[markName].time -= this._startTimestamp;
</span><span class="lines">@@ -73,25 +72,24 @@
</span><span class="cx"> 
</span><span class="cx">         results[Strings.json.samples] = samples[0].map(function(timestamp, i) {
</span><span class="cx">             var result = {
</span><del>-                // Represent time in seconds
</del><ins>+                // Represent time in milliseconds
</ins><span class="cx">                 time: timestamp - this._startTimestamp,
</span><span class="cx">                 complexity: samples[1][i]
</span><span class="cx">             };
</span><span class="cx"> 
</span><del>-            // time offsets represented as FPS
</del><span class="cx">             if (i == 0)
</span><del>-                result.fps = 60;
</del><ins>+                result.frameLength = 1000/60;
</ins><span class="cx">             else
</span><del>-                result.fps = 1000 / (timestamp - samples[0][i - 1]);
</del><ins>+                result.frameLength = timestamp - samples[0][i - 1];
</ins><span class="cx"> 
</span><span class="cx">             if (samples[2][i] != -1)
</span><del>-                result.smoothedFPS = samples[2][i];
</del><ins>+                result.smoothedFrameLength = samples[2][i];
</ins><span class="cx"> 
</span><span class="cx">             // Don't start adding data to the experiments until we reach the sampling timestamp
</span><del>-            if (i &gt;= samplingIndex) {
</del><ins>+            if (i &gt;= samplingStartIndex &amp;&amp; (samplingEndIndex == -1 || i &lt; samplingEndIndex)) {
</ins><span class="cx">                 complexityExperiment.sample(result.complexity);
</span><del>-                if (result.smoothedFPS &amp;&amp; result.smoothedFPS != -1)
-                    smoothedFPSExperiment.sample(result.smoothedFPS);
</del><ins>+                if (result.smoothedFrameLength &amp;&amp; result.smoothedFrameLength != -1)
+                    smoothedFrameLengthExperiment.sample(result.smoothedFrameLength);
</ins><span class="cx">             }
</span><span class="cx"> 
</span><span class="cx">             return result;
</span><span class="lines">@@ -106,12 +104,12 @@
</span><span class="cx">         complexityResults[Strings.json.measurements.stdev] = complexityExperiment.standardDeviation();
</span><span class="cx">         complexityResults[Strings.json.measurements.percent] = complexityExperiment.percentage();
</span><span class="cx"> 
</span><del>-        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();
</del><ins>+        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();
</ins><span class="cx">     }
</span><span class="cx"> });
</span><span class="cx"> 
</span><span class="lines">@@ -156,7 +154,7 @@
</span><span class="cx">     {
</span><span class="cx">         if (!this._startedSampling &amp;&amp; timestamp &gt; this._samplingTimestamp) {
</span><span class="cx">             this._startedSampling = true;
</span><del>-            this.mark(Strings.json.samplingTimeOffset, this._samplingTimestamp);
</del><ins>+            this.mark(Strings.json.samplingStartTimeOffset, this._samplingTimestamp);
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // Start the work for the next frame.
</span><span class="lines">@@ -175,7 +173,7 @@
</span><span class="cx">         tuneValue = tuneValue &gt; 0 ? Math.floor(tuneValue) : Math.ceil(tuneValue);
</span><span class="cx">         stage.tune(tuneValue);
</span><span class="cx"> 
</span><del>-        this._sampler.record(timestamp, stage.complexity(), intervalEstimatedFrameRate);
</del><ins>+        this._sampler.record(timestamp, stage.complexity(), this._estimator.estimate);
</ins><span class="cx"> 
</span><span class="cx">         // Start the next interval.
</span><span class="cx">         this._intervalFrameCount = 0;
</span><span class="lines">@@ -185,7 +183,7 @@
</span><span class="cx">     processSamples: function(results)
</span><span class="cx">     {
</span><span class="cx">         Controller.prototype.processSamples.call(this, results);
</span><del>-        results[Strings.json.targetFPS] = this._targetFrameRate;
</del><ins>+        results[Strings.json.targetFrameLength] = 1000 / this._targetFrameRate;
</ins><span class="cx">     }
</span><span class="cx"> });
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkPerformanceTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/ChangeLog (196291 => 196292)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ChangeLog        2016-02-09 03:30:26 UTC (rev 196291)
+++ trunk/PerformanceTests/ChangeLog        2016-02-09 03:30:29 UTC (rev 196292)
</span><span class="lines">@@ -1,5 +1,27 @@
</span><span class="cx"> 2016-02-07  Jon Lee  &lt;jonlee@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        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  &lt;jonlee@apple.com&gt;
+
</ins><span class="cx">         Add option to use different methods for retrieving a timestamp.
</span><span class="cx"> 
</span><span class="cx">         * Animometer/developer.html: Add performance.now and Date.now options.
</span></span></pre>
</div>
</div>

</body>
</html>