From 87b2f018730ee8b9a16f5bef63b95d38ae9514fb Mon Sep 17 00:00:00 2001 From: "ulan@chromium.org" Date: Thu, 6 Jun 2013 12:24:05 +0000 Subject: [PATCH] Revert "Make more GCs in idle notification handler." because of performance regression. R=jkummerow@chromium.org BUG=246141 Review URL: https://chromiumcodereview.appspot.com/15864010 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14974 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/heap.cc | 18 ++++++++++-------- src/heap.h | 2 ++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/heap.cc b/src/heap.cc index 5e88aca..6a89efd 100644 --- a/src/heap.cc +++ b/src/heap.cc @@ -151,6 +151,7 @@ Heap::Heap() last_idle_notification_gc_count_(0), last_idle_notification_gc_count_init_(false), mark_sweeps_since_idle_round_started_(0), + ms_count_at_last_idle_notification_(0), gc_count_at_last_idle_gc_(0), scavenges_since_last_idle_round_(kIdleScavengeThreshold), gcs_since_last_deopt_(0), @@ -5707,7 +5708,6 @@ void Heap::AdvanceIdleIncrementalMarking(intptr_t step_size) { uncommit = true; } CollectAllGarbage(kNoGCFlags, "idle notification: finalize incremental"); - mark_sweeps_since_idle_round_started_++; gc_count_at_last_idle_gc_ = gc_count_; if (uncommit) { new_space_.Shrink(); @@ -5783,9 +5783,18 @@ bool Heap::IdleNotification(int hint) { } } + int new_mark_sweeps = ms_count_ - ms_count_at_last_idle_notification_; + mark_sweeps_since_idle_round_started_ += new_mark_sweeps; + ms_count_at_last_idle_notification_ = ms_count_; + int remaining_mark_sweeps = kMaxMarkSweepsInIdleRound - mark_sweeps_since_idle_round_started_; + if (remaining_mark_sweeps <= 0) { + FinishIdleRound(); + return true; + } + if (incremental_marking()->IsStopped()) { // If there are no more than two GCs left in this idle round and we are // allowed to do a full GC, then make those GCs full in order to compact @@ -5795,7 +5804,6 @@ bool Heap::IdleNotification(int hint) { if (remaining_mark_sweeps <= 2 && hint >= kMinHintForFullGC) { CollectAllGarbage(kReduceMemoryFootprintMask, "idle notification: finalize idle round"); - mark_sweeps_since_idle_round_started_++; } else { incremental_marking()->Start(); } @@ -5803,12 +5811,6 @@ bool Heap::IdleNotification(int hint) { if (!incremental_marking()->IsStopped()) { AdvanceIdleIncrementalMarking(step_size); } - - if (mark_sweeps_since_idle_round_started_ >= kMaxMarkSweepsInIdleRound) { - FinishIdleRound(); - return true; - } - return false; } diff --git a/src/heap.h b/src/heap.h index 394a02a..6d04454 100644 --- a/src/heap.h +++ b/src/heap.h @@ -2261,6 +2261,7 @@ class Heap { void StartIdleRound() { mark_sweeps_since_idle_round_started_ = 0; + ms_count_at_last_idle_notification_ = ms_count_; } void FinishIdleRound() { @@ -2337,6 +2338,7 @@ class Heap { bool last_idle_notification_gc_count_init_; int mark_sweeps_since_idle_round_started_; + int ms_count_at_last_idle_notification_; unsigned int gc_count_at_last_idle_gc_; int scavenges_since_last_idle_round_; -- 2.7.4