Diff
Modified: trunk/LayoutTests/ChangeLog (89007 => 89008)
--- trunk/LayoutTests/ChangeLog 2011-06-16 06:15:29 UTC (rev 89007)
+++ trunk/LayoutTests/ChangeLog 2011-06-16 06:24:14 UTC (rev 89008)
@@ -1,3 +1,17 @@
+2011-06-15 Mikhail Naganov <[email protected]>
+
+ Reviewed by Pavel Feldman.
+
+ WebInspector [Chromium]: Make heap snapshots UI more responsive.
+ https://bugs.webkit.org/show_bug.cgi?id=62360
+
+ Two changes have been made:
+ - when we request elements, sort array only partially;
+ - when populating children, do it in batches;
+
+ * inspector/profiler/heap-snapshot.html:
+ * inspector/utilities.html:
+
2011-06-08 Keishi Hattori <[email protected]>
Reviewed by Kent Tamura.
Modified: trunk/LayoutTests/inspector/profiler/heap-snapshot.html (89007 => 89008)
--- trunk/LayoutTests/inspector/profiler/heap-snapshot.html 2011-06-16 06:15:29 UTC (rev 89007)
+++ trunk/LayoutTests/inspector/profiler/heap-snapshot.html 2011-06-16 06:24:14 UTC (rev 89008)
@@ -159,8 +159,9 @@
var provider = new WebInspector.HeapSnapshotNodesProvider(snapshot, nodeFilter);
// Sort by names in reverse order.
- provider.sort(WebInspector.HeapSnapshotFilteredOrderedIterator.prototype.createComparator(["name", false, "id", false]));
InspectorTest.assertEquals(3, provider.length, "nodes provider length");
+ provider.sort(WebInspector.HeapSnapshotFilteredOrderedIterator.prototype.createComparator(["name", false, "id", false]), 0, 2, 3);
+ InspectorTest.assertEquals(3, provider.length, "nodes provider length");
var names = [];
for (provider.first(); provider.hasNext(); provider.next())
names.push(provider.item.name);
@@ -178,8 +179,9 @@
}
var provider = new WebInspector.HeapSnapshotEdgesProvider(snapshot, snapshot.rootNodeIndex, edgeFilter);
- provider.sort(WebInspector.HeapSnapshotFilteredOrderedIterator.prototype.createComparator(["!edgeName", false, "id", false]));
InspectorTest.assertEquals(1, provider.length, "edges provider length");
+ provider.sort(WebInspector.HeapSnapshotFilteredOrderedIterator.prototype.createComparator(["!edgeName", false, "id", false]), 0, 0, 1);
+ InspectorTest.assertEquals(1, provider.length, "edges provider length");
var names = [];
for (provider.first(); provider.hasNext(); provider.next())
names.push(provider.item.name);
Modified: trunk/LayoutTests/inspector/utilities-expected.txt (89007 => 89008)
--- trunk/LayoutTests/inspector/utilities-expected.txt 2011-06-16 06:15:29 UTC (rev 89007)
+++ trunk/LayoutTests/inspector/utilities-expected.txt 2011-06-16 06:24:14 UTC (rev 89008)
@@ -1,4 +1,7 @@
This test checks Web Inspector utilities.
-PASS: binaryIndexOf
+Running: binaryIndexOfTest
+
+Running: sortRangeTest
+
Modified: trunk/LayoutTests/inspector/utilities.html (89007 => 89008)
--- trunk/LayoutTests/inspector/utilities.html 2011-06-16 06:15:29 UTC (rev 89007)
+++ trunk/LayoutTests/inspector/utilities.html 2011-06-16 06:24:14 UTC (rev 89008)
@@ -5,46 +5,82 @@
function test()
{
- (function binaryIndexOfTest()
- {
- var testArrays = [
- [],
- [1],
- [1, 10],
- [1, 10, 11, 12, 13, 14, 100],
- [-100, -50, 0, 50, 100],
- [-100, -14, -13, -12, -11, -10, -1]
- ];
-
- function testArray(array)
+ InspectorTest.runTestSuite([
+ function binaryIndexOfTest(next)
{
- function comparator(a, b)
+ var testArrays = [
+ [],
+ [1],
+ [1, 10],
+ [1, 10, 11, 12, 13, 14, 100],
+ [-100, -50, 0, 50, 100],
+ [-100, -14, -13, -12, -11, -10, -1]
+ ];
+
+ function testArray(array)
{
- return a < b ? -1 : (a > b ? 1 : 0);
+ function comparator(a, b)
+ {
+ return a < b ? -1 : (a > b ? 1 : 0);
+ }
+
+ for (var i = -100; i <= 100; ++i) {
+ var reference = array.indexOf(i);
+ var actual = array.binaryIndexOf(i, comparator);
+ InspectorTest.assertEquals(reference, actual, "binaryIndexOf");
+ }
+ return true;
}
+
+ for (var i = 0, l = testArrays.length; i < l; ++i)
+ testArray(testArrays[i]);
+ next();
+ },
- for (var i = -100; i <= 100; ++i) {
- var reference = array.indexOf(i);
- var actual = array.binaryIndexOf(i, comparator);
- if (reference !== actual) {
- InspectorTest.addResult(String.vsprintf("FAIL: binaryIndexOf: expected %d, actual %d for %d on %s", [expected, actual, i, array.join(",")]));
- return false;
+ function sortRangeTest(next)
+ {
+ var testArrays = [
+ [],
+ [1],
+ [2, 1],
+ [6, 4, 2, 7, 10, 15, 1],
+ [10, 44, 3, 6, 56, 66, 10, 55, 32, 56, 2, 5]
+ ];
+
+ function testArray(array)
+ {
+ function comparator(a, b)
+ {
+ return a < b ? -1 : (a > b ? 1 : 0);
}
+
+ function compareArrays(a, b, message)
+ {
+ InspectorTest.assertEquals(JSON.stringify(a), JSON.stringify(b), message);
+ }
+
+ for (var left = 0, l = array.length - 1; left < l; ++left) {
+ for (var right = left + 1, r = array.length; right < r; ++right)
+ for (var count = 1, k = right - left + 1; count <= k; ++count) {
+ var actual = array.slice(0);
+ actual.sortRange(comparator, left, right, count);
+ compareArrays(array.slice(0, left), actual.slice(0, left), "left " + left + " " + right + " " + count);
+ compareArrays(array.slice(right + 1), actual.slice(right + 1), "right " + left + " " + right + " " + count);
+ var middle = array.slice(left, right + 1);
+ middle.sort(comparator);
+ compareArrays(middle.slice(0, count), actual.slice(left, left + count), "sorted " + left + " " + right + " " + count);
+ actualRest = actual.slice(left + count, right + 1);
+ actualRest.sort(comparator);
+ compareArrays(middle.slice(count), actualRest, "unsorted " + left + " " + right + " " + count);
+ }
+ }
}
- return true;
- }
- var passed = true;
- for (var i = 0, l = testArrays.length; i < l; ++i) {
- if (!testArray(testArrays[i])) {
- passed = false;
- break;
- }
+ for (var i = 0, len = testArrays.length; i < len; ++i)
+ testArray(testArrays[i]);
+ next();
}
- if (passed)
- InspectorTest.addResult("PASS: binaryIndexOf");
- InspectorTest.completeTest();
- })();
+ ]);
}
</script>
Modified: trunk/Source/WebCore/ChangeLog (89007 => 89008)
--- trunk/Source/WebCore/ChangeLog 2011-06-16 06:15:29 UTC (rev 89007)
+++ trunk/Source/WebCore/ChangeLog 2011-06-16 06:24:14 UTC (rev 89008)
@@ -1,3 +1,31 @@
+2011-06-15 Mikhail Naganov <[email protected]>
+
+ Reviewed by Pavel Feldman.
+
+ WebInspector [Chromium]: Make heap snapshots UI more responsive.
+ https://bugs.webkit.org/show_bug.cgi?id=62360
+
+ Two changes have been made:
+ - when we request elements, sort array only partially;
+ - when populating children, do it in batches;
+
+ * WebCore.gypi:
+ * WebCore.vcproj/WebCore.vcproj:
+ * inspector/front-end/DetailedHeapshotGridNodes.js:
+ (WebInspector.HeapSnapshotGridNode.prototype.populateChildren.callSerialize):
+ (WebInspector.HeapSnapshotGridNode.prototype.populateChildren.childrenRetrieved):
+ (WebInspector.HeapSnapshotGridNode.prototype.populateChildren):
+ * inspector/front-end/HeapSnapshot.js:
+ (WebInspector.HeapSnapshotFilteredOrderedIterator):
+ (WebInspector.HeapSnapshotFilteredOrderedIterator.prototype.serializeNextItems):
+ (WebInspector.HeapSnapshotFilteredOrderedIterator.prototype.sortAndRewind):
+ (WebInspector.HeapSnapshotEdgesProvider.prototype.sort):
+ (WebInspector.HeapSnapshotNodesProvider.prototype.sort):
+ * inspector/front-end/HeapSnapshotWorker.js:
+ * inspector/front-end/PartialQuickSort.js: Added.
+ * inspector/front-end/WebKit.qrc:
+ * inspector/front-end/inspector.html:
+
2011-06-15 Adam Barth <[email protected]>
Reviewed by Eric Seidel.
Modified: trunk/Source/WebCore/WebCore.gypi (89007 => 89008)
--- trunk/Source/WebCore/WebCore.gypi 2011-06-16 06:15:29 UTC (rev 89007)
+++ trunk/Source/WebCore/WebCore.gypi 2011-06-16 06:24:14 UTC (rev 89008)
@@ -6257,6 +6257,7 @@
'inspector/front-end/ObjectPropertiesSection.js',
'inspector/front-end/Panel.js',
'inspector/front-end/PanelEnablerView.js',
+ 'inspector/front-end/PartialQuickSort.js',
'inspector/front-end/Placard.js',
'inspector/front-end/PleaseWaitMessage.js',
'inspector/front-end/Popover.js',
Modified: trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj (89007 => 89008)
--- trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj 2011-06-16 06:15:29 UTC (rev 89007)
+++ trunk/Source/WebCore/WebCore.vcproj/WebCore.vcproj 2011-06-16 06:24:14 UTC (rev 89008)
@@ -68093,6 +68093,10 @@
>
</File>
<File
+ RelativePath="..\inspector\front-end\PartialQuickSort.js"
+ >
+ </File>
+ <File
RelativePath="..\inspector\front-end\Placard.js"
>
</File>
Modified: trunk/Source/WebCore/inspector/front-end/DetailedHeapshotGridNodes.js (89007 => 89008)
--- trunk/Source/WebCore/inspector/front-end/DetailedHeapshotGridNodes.js 2011-06-16 06:15:29 UTC (rev 89007)
+++ trunk/Source/WebCore/inspector/front-end/DetailedHeapshotGridNodes.js 2011-06-16 06:24:14 UTC (rev 89008)
@@ -85,10 +85,17 @@
break;
}
}
-
+
+ var part = 0;
+ function callSerialize()
+ {
+ if (part >= howMany)
+ return;
+ part += this._defaultPopulateCount;
+ provider.serializeNextItems(this._defaultPopulateCount, childrenRetrieved.bind(this));
+ }
function childrenRetrieved(items)
{
- var hasNext = items.hasNext;
var length = items.totalLength;
for (var i = 0, l = items.length; i < l; ++i) {
var item = items[i];
@@ -102,8 +109,12 @@
this.insertChild(this._createChildNode(item, provider), atIndex++);
}
provider.instanceCount += items.length;
+ if (part < howMany) {
+ setTimeout(callSerialize.bind(this), 0);
+ return;
+ }
- if (hasNext)
+ if (items.hasNext)
this.insertChild(new WebInspector.ShowMoreDataGridNode(this.populateChildren.bind(this, provider), this._defaultPopulateCount, length), atIndex++);
if (afterPopulate)
afterPopulate();
@@ -116,10 +127,6 @@
}
WebInspector.PleaseWaitMessage.prototype.hide();
}
- function callSerialize()
- {
- provider.serializeNextItems(howMany, childrenRetrieved.bind(this));
- }
setTimeout(callSerialize.bind(this), 0);
},
Modified: trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js (89007 => 89008)
--- trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js 2011-06-16 06:15:29 UTC (rev 89007)
+++ trunk/Source/WebCore/inspector/front-end/HeapSnapshot.js 2011-06-16 06:24:14 UTC (rev 89008)
@@ -957,6 +957,7 @@
this._iterator = iterator;
this._iterationOrder = iterationOrder ? iterationOrder.slice(0) : null;
this._position = 0;
+ this._currentComparator = null;
this._lastComparator = null;
}
@@ -1020,18 +1021,24 @@
serializeNextItems: function(count)
{
+ if (!this._iterationOrder)
+ this._createIterationOrder();
var result = new Array(count);
+ if (this._lastComparator !== this._currentComparator)
+ this.sort(this._currentComparator, this._position, this._iterationOrder.length - 1, count);
for (var i = 0 ; i < count && this.hasNext(); ++i, this.next())
result[i] = this._serialize(this.item);
result.length = i;
result.hasNext = this.hasNext();
- result.totalLength = this.length;
+ result.totalLength = this._iterationOrder.length;
return result;
},
sortAndRewind: function(comparator)
{
- var result = this.sort(comparator);
+ this._lastComparator = this._currentComparator;
+ this._currentComparator = comparator;
+ var result = this._lastComparator !== this._currentComparator;
if (result)
this.first();
return result;
@@ -1056,11 +1063,8 @@
return {name: edge.name, node: WebInspector.HeapSnapshotNodesProvider.prototype._serialize(edge.node), nodeIndex: edge.nodeIndex, type: edge.type};
},
- sort: function(comparator)
+ sort: function(comparator, leftBound, rightBound, count)
{
- if (this._lastComparator === comparator)
- return false;
- this._lastComparator = comparator;
var fieldName1 = comparator.fieldName1;
var fieldName2 = comparator.fieldName2;
var ascending1 = comparator.ascending1;
@@ -1096,9 +1100,6 @@
return ascending ? result : -result;
}
- if (!this._iterationOrder)
- this._createIterationOrder();
-
function sortByEdgeAndNode(indexA, indexB) {
var result = sortByEdgeFieldName(ascending1, indexA, indexB);
if (result === 0)
@@ -1121,12 +1122,11 @@
}
if (fieldName1 === "!edgeName")
- this._iterationOrder.sort(sortByEdgeAndNode);
+ this._iterationOrder.sortRange(sortByEdgeAndNode, leftBound, rightBound, count);
else if (fieldName2 === "!edgeName")
- this._iterationOrder.sort(sortByNodeAndEdge);
+ this._iterationOrder.sortRange(sortByNodeAndEdge, leftBound, rightBound, count);
else
- this._iterationOrder.sort(sortByNodeAndNode);
- return true;
+ this._iterationOrder.sortRange(sortByNodeAndNode, leftBound, rightBound, count);
}
};
@@ -1147,11 +1147,8 @@
return {id: node.id, name: node.name, nodeIndex: node.nodeIndex, retainedSize: node.retainedSize, selfSize: node.selfSize, type: node.type};
},
- sort: function(comparator)
+ sort: function(comparator, leftBound, rightBound, count)
{
- if (this._lastComparator === comparator)
- return false;
- this._lastComparator = comparator;
var fieldName1 = comparator.fieldName1;
var fieldName2 = comparator.fieldName2;
var ascending1 = comparator.ascending1;
@@ -1170,9 +1167,6 @@
return ascending ? result : -result;
}
- if (!this._iterationOrder)
- this._createIterationOrder();
-
function sortByComparator(indexA, indexB) {
var result = sortByNodeField(fieldName1, ascending1, indexA, indexB);
if (result === 0)
@@ -1180,8 +1174,7 @@
return result;
}
- this._iterationOrder.sort(sortByComparator);
- return true;
+ this._iterationOrder.sortRange(sortByComparator, leftBound, rightBound, count);
}
};
Modified: trunk/Source/WebCore/inspector/front-end/HeapSnapshotWorker.js (89007 => 89008)
--- trunk/Source/WebCore/inspector/front-end/HeapSnapshotWorker.js 2011-06-16 06:15:29 UTC (rev 89007)
+++ trunk/Source/WebCore/inspector/front-end/HeapSnapshotWorker.js 2011-06-16 06:24:14 UTC (rev 89008)
@@ -34,6 +34,7 @@
importScripts("BinarySearch.js");
importScripts("HeapSnapshot.js");
importScripts("HeapSnapshotWorkerDispatcher.js");
+importScripts("PartialQuickSort.js");
function postMessageWrapper(message)
{
Copied: trunk/Source/WebCore/inspector/front-end/PartialQuickSort.js (from rev 89007, trunk/Source/WebCore/inspector/front-end/HeapSnapshotWorker.js) (0 => 89008)
--- trunk/Source/WebCore/inspector/front-end/PartialQuickSort.js (rev 0)
+++ trunk/Source/WebCore/inspector/front-end/PartialQuickSort.js 2011-06-16 06:24:14 UTC (rev 89008)
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2011 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+Object.defineProperty(Array.prototype, "sortRange", { value: function(comparator, leftBound, rightBound, k)
+{
+ function swap(array, i1, i2)
+ {
+ var temp = array[i1];
+ array[i1] = array[i2];
+ array[i2] = temp;
+ }
+
+ function partition(array, comparator, left, right, pivotIndex)
+ {
+ var pivotValue = array[pivotIndex];
+ swap(array, right, pivotIndex);
+ var storeIndex = left;
+ for (var i = left; i < right; ++i) {
+ if (comparator(array[i], pivotValue) < 0) {
+ swap(array, storeIndex, i);
+ ++storeIndex;
+ }
+ }
+ swap(array, right, storeIndex);
+ return storeIndex;
+ }
+
+ function quickSortFirstK(array, comparator, left, right, k)
+ {
+ if (right <= left)
+ return;
+ var pivotIndex = Math.floor(Math.random() * (right - left)) + left;
+ var pivotNewIndex = partition(array, comparator, left, right, pivotIndex);
+ quickSortFirstK(array, comparator, left, pivotNewIndex - 1, k);
+ if (pivotNewIndex < left + k - 1)
+ quickSortFirstK(array, comparator, pivotNewIndex + 1, right, k);
+ }
+
+ if (leftBound === 0 && rightBound === (this.length - 1) && k === this.length)
+ this.sort(comparator);
+ else
+ quickSortFirstK(this, comparator, leftBound, rightBound, k);
+ return this;
+}});
Modified: trunk/Source/WebCore/inspector/front-end/WebKit.qrc (89007 => 89008)
--- trunk/Source/WebCore/inspector/front-end/WebKit.qrc 2011-06-16 06:15:29 UTC (rev 89007)
+++ trunk/Source/WebCore/inspector/front-end/WebKit.qrc 2011-06-16 06:24:14 UTC (rev 89008)
@@ -70,6 +70,7 @@
<file>ObjectPropertiesSection.js</file>
<file>Panel.js</file>
<file>PanelEnablerView.js</file>
+ <file>PartialQuickSort.js</file>
<file>Placard.js</file>
<file>PleaseWaitMessage.js</file>
<file>Popover.js</file>
Modified: trunk/Source/WebCore/inspector/front-end/inspector.html (89007 => 89008)
--- trunk/Source/WebCore/inspector/front-end/inspector.html 2011-06-16 06:15:29 UTC (rev 89007)
+++ trunk/Source/WebCore/inspector/front-end/inspector.html 2011-06-16 06:24:14 UTC (rev 89008)
@@ -143,6 +143,7 @@
<script type="text/_javascript_" src=""
<script type="text/_javascript_" src=""
<script type="text/_javascript_" src=""
+ <script type="text/_javascript_" src=""
<script type="text/_javascript_" src=""
<script type="text/_javascript_" src=""
<script type="text/_javascript_" src=""
Modified: trunk/Source/WebKit/chromium/ChangeLog (89007 => 89008)
--- trunk/Source/WebKit/chromium/ChangeLog 2011-06-16 06:15:29 UTC (rev 89007)
+++ trunk/Source/WebKit/chromium/ChangeLog 2011-06-16 06:24:14 UTC (rev 89008)
@@ -1,3 +1,16 @@
+2011-06-15 Mikhail Naganov <[email protected]>
+
+ Reviewed by Pavel Feldman.
+
+ WebInspector [Chromium]: Make heap snapshots UI more responsive.
+ https://bugs.webkit.org/show_bug.cgi?id=62360
+
+ Two changes have been made:
+ - when we request elements, sort array only partially;
+ - when populating children, do it in batches;
+
+ * WebKit.gyp:
+
2011-06-15 Adam Barth <[email protected]>
Reviewed by Eric Seidel.
Modified: trunk/Source/WebKit/chromium/WebKit.gyp (89007 => 89008)
--- trunk/Source/WebKit/chromium/WebKit.gyp 2011-06-16 06:15:29 UTC (rev 89007)
+++ trunk/Source/WebKit/chromium/WebKit.gyp 2011-06-16 06:24:14 UTC (rev 89008)
@@ -1279,6 +1279,7 @@
'../../WebCore/inspector/front-end/BinarySearch.js',
'../../WebCore/inspector/front-end/HeapSnapshot.js',
'../../WebCore/inspector/front-end/HeapSnapshotWorkerDispatcher.js',
+ '../../WebCore/inspector/front-end/PartialQuickSort.js',
],
'search_path': '../../WebCore/inspector/front-end',
'outputs': ['<(PRODUCT_DIR)/resources/inspector/HeapSnapshotWorker.js'],