Index: src/heap/heap.cc |
diff --git a/src/heap/heap.cc b/src/heap/heap.cc |
index ddc12be50dac327a66c90ac0bfc1234f56d5b109..e67e0b3983c5fb5762bdc14f2c2faca98696abc3 100644 |
--- a/src/heap/heap.cc |
+++ b/src/heap/heap.cc |
@@ -4386,12 +4386,12 @@ void Heap::IdleMarkCompact(const char* message) { |
void Heap::TryFinalizeIdleIncrementalMarking( |
- size_t idle_time_in_ms, size_t size_of_objects, |
+ double idle_time_in_ms, size_t size_of_objects, |
size_t final_incremental_mark_compact_speed_in_bytes_per_ms) { |
if (incremental_marking()->IsComplete() || |
(mark_compact_collector()->IsMarkingDequeEmpty() && |
gc_idle_time_handler_.ShouldDoFinalIncrementalMarkCompact( |
- idle_time_in_ms, size_of_objects, |
+ static_cast<size_t>(idle_time_in_ms), size_of_objects, |
final_incremental_mark_compact_speed_in_bytes_per_ms))) { |
CollectAllGarbage(kNoGCFlags, "idle notification: finalize incremental"); |
} |
@@ -4404,11 +4404,24 @@ bool Heap::WorthActivatingIncrementalMarking() { |
} |
+static double MonotonicallyIncreasingTimeInMs() { |
+ return V8::GetCurrentPlatform()->MonotonicallyIncreasingTime() * |
+ static_cast<double>(base::Time::kMillisecondsPerSecond); |
+} |
+ |
+ |
bool Heap::IdleNotification(int idle_time_in_ms) { |
- base::ElapsedTimer timer; |
- timer.Start(); |
- isolate()->counters()->gc_idle_time_allotted_in_ms()->AddSample( |
- idle_time_in_ms); |
+ return IdleNotification( |
+ V8::GetCurrentPlatform()->MonotonicallyIncreasingTime() + |
+ (static_cast<double>(idle_time_in_ms) / |
+ static_cast<double>(base::Time::kMillisecondsPerSecond))); |
+} |
+ |
+ |
+bool Heap::IdleNotification(double deadline_in_seconds) { |
+ double deadline_in_ms = |
+ deadline_in_seconds * |
+ static_cast<double>(base::Time::kMillisecondsPerSecond); |
HistogramTimerScope idle_notification_scope( |
isolate_->counters()->gc_idle_notification()); |
@@ -4438,11 +4451,13 @@ bool Heap::IdleNotification(int idle_time_in_ms) { |
static_cast<size_t>( |
tracer()->NewSpaceAllocationThroughputInBytesPerMillisecond()); |
+ double idle_time_in_ms = deadline_in_ms - MonotonicallyIncreasingTimeInMs(); |
GCIdleTimeAction action = |
gc_idle_time_handler_.Compute(idle_time_in_ms, heap_state); |
+ isolate()->counters()->gc_idle_time_allotted_in_ms()->AddSample( |
+ static_cast<int>(idle_time_in_ms)); |
bool result = false; |
- int actual_time_in_ms = 0; |
switch (action.type) { |
case DONE: |
result = true; |
@@ -4455,9 +4470,9 @@ bool Heap::IdleNotification(int idle_time_in_ms) { |
IncrementalMarking::NO_GC_VIA_STACK_GUARD, |
IncrementalMarking::FORCE_MARKING, |
IncrementalMarking::DO_NOT_FORCE_COMPLETION); |
- actual_time_in_ms = static_cast<int>(timer.Elapsed().InMilliseconds()); |
- int remaining_idle_time_in_ms = idle_time_in_ms - actual_time_in_ms; |
- if (remaining_idle_time_in_ms > 0) { |
+ double remaining_idle_time_in_ms = |
+ deadline_in_ms - MonotonicallyIncreasingTimeInMs(); |
+ if (remaining_idle_time_in_ms > 0.0) { |
TryFinalizeIdleIncrementalMarking( |
remaining_idle_time_in_ms, heap_state.size_of_objects, |
heap_state.final_incremental_mark_compact_speed_in_bytes_per_ms); |
@@ -4485,21 +4500,25 @@ bool Heap::IdleNotification(int idle_time_in_ms) { |
break; |
} |
- actual_time_in_ms = static_cast<int>(timer.Elapsed().InMilliseconds()); |
- if (actual_time_in_ms <= idle_time_in_ms) { |
+ double current_time = MonotonicallyIncreasingTimeInMs(); |
+ double deadline_difference = deadline_in_ms - current_time; |
+ |
+ if (deadline_difference >= 0) { |
if (action.type != DONE && action.type != DO_NOTHING) { |
isolate()->counters()->gc_idle_time_limit_undershot()->AddSample( |
- idle_time_in_ms - actual_time_in_ms); |
+ static_cast<int>(deadline_difference)); |
} |
} else { |
isolate()->counters()->gc_idle_time_limit_overshot()->AddSample( |
- actual_time_in_ms - idle_time_in_ms); |
+ static_cast<int>(-deadline_difference)); |
} |
if ((FLAG_trace_idle_notification && action.type > DO_NOTHING) || |
FLAG_trace_idle_notification_verbose) { |
- PrintF("Idle notification: requested idle time %d ms, actual time %d ms [", |
- idle_time_in_ms, actual_time_in_ms); |
+ PrintF( |
+ "Idle notification: requested idle time %.2f ms, used idle time %.2f " |
+ "ms, deadline usage %.2f ms [", |
+ idle_time_in_ms, current_time, deadline_difference); |
action.Print(); |
PrintF("]"); |
if (FLAG_trace_idle_notification_verbose) { |