From f456c792cbd1d59d480eb725555d13fc233255b5 Mon Sep 17 00:00:00 2001 From: Alexander Timin Date: Thu, 24 May 2018 17:11:00 +0000 Subject: [PATCH] [scheduler] Enable wake-up based throttling by default Enable wake-up based throttling by default with 3ms wake-up window. R=alexclarke@chromium.org BUG=699541 Change-Id: I9c8c273e43f812e1b296368cd227813c795d4d8d Reviewed-on: https://chromium-review.googlesource.com/1070142 Commit-Queue: Alexander Timin Reviewed-by: Alex Clarke Cr-Commit-Position: refs/heads/master@{#561535} --- .../dom/resources/timer-throttling-frame.html | 7 ++++-- .../task_queue_throttler_unittest.cc | 2 ++ .../main_thread/main_thread_scheduler_impl.cc | 23 ++++++++++++------- .../main_thread/main_thread_scheduler_impl.h | 2 ++ .../page_scheduler_impl_unittest.cc | 18 +++++++-------- 5 files changed, 32 insertions(+), 20 deletions(-) diff --git a/third_party/WebKit/LayoutTests/fast/dom/resources/timer-throttling-frame.html b/third_party/WebKit/LayoutTests/fast/dom/resources/timer-throttling-frame.html index 28fe312649f079..2d63c86b139619 100644 --- a/third_party/WebKit/LayoutTests/fast/dom/resources/timer-throttling-frame.html +++ b/third_party/WebKit/LayoutTests/fast/dom/resources/timer-throttling-frame.html @@ -1,6 +1,9 @@ - + diff --git a/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler_unittest.cc b/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler_unittest.cc index 7bd9041b990293..3bd39ee366e6f2 100644 --- a/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler_unittest.cc @@ -96,6 +96,8 @@ class TaskQueueThrottlerTest : public testing::Test { base::sequence_manager::TaskQueueManagerForTest::Create( nullptr, mock_task_runner_, clock_.get()), base::nullopt)); + scheduler_->GetWakeUpBudgetPoolForTesting()->SetWakeUpDuration( + base::TimeDelta()); task_queue_throttler_ = scheduler_->task_queue_throttler(); timer_queue_ = scheduler_->NewTimerTaskQueue( MainThreadTaskQueue::QueueType::kFrameThrottleable, nullptr); diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc index 641a9d6599d86e..292a82df666df7 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc @@ -68,7 +68,8 @@ const double kSamplingRateForTaskUkm = 0.0001; const char kWakeUpThrottlingTrial[] = "RendererSchedulerWakeUpThrottling"; const char kWakeUpDurationParam[] = "wake_up_duration_ms"; -constexpr base::TimeDelta kDefaultWakeUpDuration = base::TimeDelta(); +constexpr base::TimeDelta kDefaultWakeUpDuration = + base::TimeDelta::FromMilliseconds(3); base::TimeDelta GetWakeUpDuration() { int duration_ms; @@ -1829,6 +1830,7 @@ IdleTimeEstimator* MainThreadSchedulerImpl::GetIdleTimeEstimatorForTesting() { } WakeUpBudgetPool* MainThreadSchedulerImpl::GetWakeUpBudgetPoolForTesting() { + InitWakeUpBudgetPoolIfNeeded(); return main_thread_only().wake_up_budget_pool; } @@ -2704,17 +2706,22 @@ MainThreadSchedulerImpl::GetVirtualTimeDomain() { void MainThreadSchedulerImpl::AddQueueToWakeUpBudgetPool( MainThreadTaskQueue* queue) { - if (!main_thread_only().wake_up_budget_pool) { - main_thread_only().wake_up_budget_pool = - task_queue_throttler()->CreateWakeUpBudgetPool("renderer_wake_up_pool"); - main_thread_only().wake_up_budget_pool->SetWakeUpRate(1); - main_thread_only().wake_up_budget_pool->SetWakeUpDuration( - GetWakeUpDuration()); - } + InitWakeUpBudgetPoolIfNeeded(); main_thread_only().wake_up_budget_pool->AddQueue(tick_clock()->NowTicks(), queue); } +void MainThreadSchedulerImpl::InitWakeUpBudgetPoolIfNeeded() { + if (main_thread_only().wake_up_budget_pool) + return; + + main_thread_only().wake_up_budget_pool = + task_queue_throttler()->CreateWakeUpBudgetPool("renderer_wake_up_pool"); + main_thread_only().wake_up_budget_pool->SetWakeUpRate(1); + main_thread_only().wake_up_budget_pool->SetWakeUpDuration( + GetWakeUpDuration()); +} + TimeDomain* MainThreadSchedulerImpl::GetActiveTimeDomain() { if (main_thread_only().use_virtual_time) { return GetVirtualTimeDomain(); diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h index 165789ae8d3bbd..7b2b64a33c405b 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h @@ -653,6 +653,8 @@ class PLATFORM_EXPORT MainThreadSchedulerImpl PageSchedulerImpl* page_scheduler, size_t page_schedulers_to_attribute); + void InitWakeUpBudgetPoolIfNeeded(); + // Indicates that scheduler has been shutdown. // It should be accessed only on the main thread, but couldn't be a member // of MainThreadOnly struct because last might be destructed before we diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc index 8410aeccfb1565..e2aec6c32fc9cc 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl_unittest.cc @@ -168,8 +168,8 @@ TEST_F(PageSchedulerImplTest, RepeatingTimer_PageInBackgroundThenForeground) { ThrottleableTaskQueue()->PostDelayedTask( FROM_HERE, MakeRepeatingTask(ThrottleableTaskQueue(), &run_count, - base::TimeDelta::FromMilliseconds(1)), - base::TimeDelta::FromMilliseconds(1)); + base::TimeDelta::FromMilliseconds(20)), + base::TimeDelta::FromMilliseconds(20)); mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); EXPECT_EQ(1, run_count); @@ -180,9 +180,7 @@ TEST_F(PageSchedulerImplTest, RepeatingTimer_PageInBackgroundThenForeground) { run_count = 0; mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); - EXPECT_EQ(1001, run_count); // Note we end up running 1001 here because the - // task was posted while throttled with a delay of 1ms so the first task was - // due to run before the 1s period started. + EXPECT_EQ(50, run_count); } TEST_F(PageSchedulerImplTest, RepeatingLoadingTask_PageInBackground) { @@ -214,18 +212,18 @@ TEST_F(PageSchedulerImplTest, RepeatingTimers_OneBackgroundOneForeground) { ThrottleableTaskQueue()->PostDelayedTask( FROM_HERE, MakeRepeatingTask(ThrottleableTaskQueue(), &run_count1, - base::TimeDelta::FromMilliseconds(1)), - base::TimeDelta::FromMilliseconds(1)); + base::TimeDelta::FromMilliseconds(20)), + base::TimeDelta::FromMilliseconds(20)); ThrottleableTaskQueueForScheduler(frame_scheduler2.get()) ->PostDelayedTask( FROM_HERE, MakeRepeatingTask( ThrottleableTaskQueueForScheduler(frame_scheduler2.get()), - &run_count2, base::TimeDelta::FromMilliseconds(1)), - base::TimeDelta::FromMilliseconds(1)); + &run_count2, base::TimeDelta::FromMilliseconds(20)), + base::TimeDelta::FromMilliseconds(20)); mock_task_runner_->RunForPeriod(base::TimeDelta::FromSeconds(1)); - EXPECT_EQ(1000, run_count1); + EXPECT_EQ(50, run_count1); EXPECT_EQ(1, run_count2); }