Tune snapshot taking progress indicator.

As of dominators and retained sizes calculation take quite small time now
comparing to the main passes, it is worth to exclude these from progress
indicator. Now the indicator smoothly runs to 100%, while previously
it ran to 50% and then instantly jumped to 100%.

BUG=none
TEST=none

Review URL: https://chromiumcodereview.appspot.com/9465010
Patch from Alexei Filippov <alexeif@chromium.org>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10831 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 289b44f7
...@@ -3166,7 +3166,7 @@ bool HeapSnapshotGenerator::GenerateSnapshot() { ...@@ -3166,7 +3166,7 @@ bool HeapSnapshotGenerator::GenerateSnapshot() {
debug_heap->Verify(); debug_heap->Verify();
#endif #endif
SetProgressTotal(4); // 2 passes + dominators + sizes. SetProgressTotal(2); // 2 passes.
#ifdef DEBUG #ifdef DEBUG
debug_heap->Verify(); debug_heap->Verify();
...@@ -3303,10 +3303,9 @@ bool HeapSnapshotGenerator::BuildDominatorTree( ...@@ -3303,10 +3303,9 @@ bool HeapSnapshotGenerator::BuildDominatorTree(
affected[children[i].to()->ordered_index()] = true; affected[children[i].to()->ordered_index()] = true;
} }
int changed = 1; bool changed = true;
const int base_progress_counter = progress_counter_; while (changed) {
while (changed != 0) { changed = false;
changed = 0;
for (int i = root_index - 1; i >= 0; --i) { for (int i = root_index - 1; i >= 0; --i) {
// If dominator of the entry has already been set to root, // If dominator of the entry has already been set to root,
// then it can't propagate any further. // then it can't propagate any further.
...@@ -3330,17 +3329,13 @@ bool HeapSnapshotGenerator::BuildDominatorTree( ...@@ -3330,17 +3329,13 @@ bool HeapSnapshotGenerator::BuildDominatorTree(
if (new_idom_index != kNoDominator if (new_idom_index != kNoDominator
&& dominators->at(i) != new_idom_index) { && dominators->at(i) != new_idom_index) {
(*dominators)[i] = new_idom_index; (*dominators)[i] = new_idom_index;
++changed; changed = true;
Vector<HeapGraphEdge> children = entries[i]->children(); Vector<HeapGraphEdge> children = entries[i]->children();
for (int j = 0; j < children.length(); ++j) { for (int j = 0; j < children.length(); ++j) {
affected[children[j].to()->ordered_index()] = true; affected[children[j].to()->ordered_index()] = true;
} }
} }
} }
int remaining = entries_length - changed;
ASSERT(remaining >= 0);
progress_counter_ = base_progress_counter + remaining;
if (!ProgressReport(true)) return false;
} }
return true; return true;
} }
...@@ -3364,21 +3359,19 @@ bool HeapSnapshotGenerator::ApproximateRetainedSizes() { ...@@ -3364,21 +3359,19 @@ bool HeapSnapshotGenerator::ApproximateRetainedSizes() {
// As for the dominators tree we only know parent nodes, not // As for the dominators tree we only know parent nodes, not
// children, to sum up total sizes we "bubble" node's self size // children, to sum up total sizes we "bubble" node's self size
// adding it to all of its parents. // adding it to all of its parents.
for (int i = 0; i < snapshot_->entries()->length(); ++i) { List<HeapEntry*>& entries = *snapshot_->entries();
HeapEntry* entry = snapshot_->entries()->at(i); for (int i = 0; i < entries.length(); ++i) {
HeapEntry* entry = entries[i];
entry->set_retained_size(entry->self_size()); entry->set_retained_size(entry->self_size());
} }
for (int i = 0; for (int i = 0; i < entries.length(); ++i) {
i < snapshot_->entries()->length(); HeapEntry* entry = entries[i];
++i, ProgressStep()) {
HeapEntry* entry = snapshot_->entries()->at(i);
int entry_size = entry->self_size(); int entry_size = entry->self_size();
for (HeapEntry* dominator = entry->dominator(); for (HeapEntry* dominator = entry->dominator();
dominator != entry; dominator != entry;
entry = dominator, dominator = entry->dominator()) { entry = dominator, dominator = entry->dominator()) {
dominator->add_retained_size(entry_size); dominator->add_retained_size(entry_size);
} }
if (!ProgressReport()) return false;
} }
return true; return true;
} }
......
...@@ -677,7 +677,7 @@ TEST(TakeHeapSnapshotAborting) { ...@@ -677,7 +677,7 @@ TEST(TakeHeapSnapshotAborting) {
LocalContext env; LocalContext env;
const int snapshots_count = v8::HeapProfiler::GetSnapshotsCount(); const int snapshots_count = v8::HeapProfiler::GetSnapshotsCount();
TestActivityControl aborting_control(3); TestActivityControl aborting_control(1);
const v8::HeapSnapshot* no_snapshot = const v8::HeapSnapshot* no_snapshot =
v8::HeapProfiler::TakeSnapshot(v8_str("abort"), v8::HeapProfiler::TakeSnapshot(v8_str("abort"),
v8::HeapSnapshot::kFull, v8::HeapSnapshot::kFull,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment