Commit 1311dfa6 authored by Robert Liao's avatar Robert Liao Committed by Commit Bot

Revert "Reland "Reland "[scheduler] Add a perftest to measure basic scheduling costs."""

This reverts commit 66769134.

Reason for revert: Experiment didn't work out. Looks like we'll need to figure out http://crbug.com/853069 or find an alternative to land this one :-/

Original change's description:
> Reland "Reland "[scheduler] Add a perftest to measure basic scheduling costs.""
> 
> This is a reland of abe98131
> 
> Original change's description:
> > Reland "[scheduler] Add a perftest to measure basic scheduling costs."
> >
> > This is a reland of 586e21ec
> >
> > Original change's description:
> > > [scheduler] Add a perftest to measure basic scheduling costs.
> > >
> > > Change-Id: Idda9f71ae005250848fd2a118e5c4344e36be452
> > > Reviewed-on: https://chromium-review.googlesource.com/1085295
> > > Reviewed-by: Alex Clarke <alexclarke@chromium.org>
> > > Commit-Queue: Alexander Timin <altimin@chromium.org>
> > > Cr-Commit-Position: refs/heads/master@{#566362}
> >
> > Change-Id: Ib9cfd16602c6bd0719059905250b91e0eb91dd22
> > Reviewed-on: https://chromium-review.googlesource.com/1097295
> > Reviewed-by: Sami Kyöstilä <skyostil@chromium.org>
> > Commit-Queue: Alexander Timin <altimin@chromium.org>
> > Cr-Commit-Position: refs/heads/master@{#567645}
> 
> Change-Id: I047a8a8bc9d5cf0e8da58f9b8f9c1d669d3e67c5
> 
> TBR=skyostil@chromium.org
> NOTREECHECKS=true
> NOTRY=true
> 
> Change-Id: I047a8a8bc9d5cf0e8da58f9b8f9c1d669d3e67c5
> Reviewed-on: https://chromium-review.googlesource.com/1102597
> Commit-Queue: Robert Liao <robliao@chromium.org>
> Reviewed-by: Robert Liao <robliao@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#567647}

TBR=robliao@chromium.org,skyostil@chromium.org,alexclarke@chromium.org,altimin@chromium.org

Change-Id: I5ebffb9dcfb6776adc740ec0cff26ee62c1aa38e
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://chromium-review.googlesource.com/1102519Reviewed-by: default avatarRobert Liao <robliao@chromium.org>
Commit-Queue: Robert Liao <robliao@chromium.org>
Cr-Commit-Position: refs/heads/master@{#567648}
parent 66769134
......@@ -236,7 +236,6 @@ source_set("perf_tests") {
sources = [
"base/task_queue_manager_perftest.cc",
"test/scheduler_perftest.cc",
]
deps = [
......
......@@ -361,7 +361,7 @@ scoped_refptr<base::SingleThreadTaskRunner> FrameSchedulerImpl::GetTaskRunner(
return nullptr;
}
scoped_refptr<MainThreadTaskQueue> FrameSchedulerImpl::LoadingTaskQueue() {
scoped_refptr<TaskQueue> FrameSchedulerImpl::LoadingTaskQueue() {
DCHECK(parent_page_scheduler_);
if (!loading_task_queue_) {
// TODO(panicker): Avoid adding this queue in RS task_runners_.
......@@ -375,8 +375,7 @@ scoped_refptr<MainThreadTaskQueue> FrameSchedulerImpl::LoadingTaskQueue() {
return loading_task_queue_;
}
scoped_refptr<MainThreadTaskQueue>
FrameSchedulerImpl::LoadingControlTaskQueue() {
scoped_refptr<TaskQueue> FrameSchedulerImpl::LoadingControlTaskQueue() {
DCHECK(parent_page_scheduler_);
if (!loading_control_task_queue_) {
loading_control_task_queue_ = main_thread_scheduler_->NewLoadingTaskQueue(
......@@ -389,7 +388,7 @@ FrameSchedulerImpl::LoadingControlTaskQueue() {
return loading_control_task_queue_;
}
scoped_refptr<MainThreadTaskQueue> FrameSchedulerImpl::ThrottleableTaskQueue() {
scoped_refptr<TaskQueue> FrameSchedulerImpl::ThrottleableTaskQueue() {
DCHECK(parent_page_scheduler_);
if (!throttleable_task_queue_) {
// TODO(panicker): Avoid adding this queue in RS task_runners_.
......@@ -419,7 +418,7 @@ scoped_refptr<MainThreadTaskQueue> FrameSchedulerImpl::ThrottleableTaskQueue() {
return throttleable_task_queue_;
}
scoped_refptr<MainThreadTaskQueue> FrameSchedulerImpl::DeferrableTaskQueue() {
scoped_refptr<TaskQueue> FrameSchedulerImpl::DeferrableTaskQueue() {
DCHECK(parent_page_scheduler_);
if (!deferrable_task_queue_) {
deferrable_task_queue_ = main_thread_scheduler_->NewTaskQueue(
......@@ -438,7 +437,7 @@ scoped_refptr<MainThreadTaskQueue> FrameSchedulerImpl::DeferrableTaskQueue() {
return deferrable_task_queue_;
}
scoped_refptr<MainThreadTaskQueue> FrameSchedulerImpl::PausableTaskQueue() {
scoped_refptr<TaskQueue> FrameSchedulerImpl::PausableTaskQueue() {
DCHECK(parent_page_scheduler_);
if (!pausable_task_queue_) {
pausable_task_queue_ = main_thread_scheduler_->NewTaskQueue(
......@@ -456,7 +455,7 @@ scoped_refptr<MainThreadTaskQueue> FrameSchedulerImpl::PausableTaskQueue() {
return pausable_task_queue_;
}
scoped_refptr<MainThreadTaskQueue> FrameSchedulerImpl::UnpausableTaskQueue() {
scoped_refptr<TaskQueue> FrameSchedulerImpl::UnpausableTaskQueue() {
DCHECK(parent_page_scheduler_);
if (!unpausable_task_queue_) {
unpausable_task_queue_ = main_thread_scheduler_->NewTaskQueue(
......@@ -790,10 +789,5 @@ void FrameSchedulerImpl::RemovePauseSubresourceLoadingHandle() {
}
}
scoped_refptr<MainThreadTaskQueue>
FrameSchedulerImpl::GetTaskQueueForTesting() {
return UnpausableTaskQueue();
}
} // namespace scheduler
} // namespace blink
......@@ -114,10 +114,6 @@ class PLATFORM_EXPORT FrameSchedulerImpl : public FrameScheduler {
// page scheduler. Should be used only for testing purposes.
FrameSchedulerImpl();
// Returns a valid per-frame task queue which should be used for testing.
// This task queue is expected to always run tasks.
scoped_refptr<MainThreadTaskQueue> GetTaskQueueForTesting();
private:
friend class PageSchedulerImpl;
friend class main_thread_scheduler_impl_unittest::MainThreadSchedulerImplTest;
......@@ -173,12 +169,12 @@ class PLATFORM_EXPORT FrameSchedulerImpl : public FrameScheduler {
void AddPauseSubresourceLoadingHandle();
void RemovePauseSubresourceLoadingHandle();
scoped_refptr<MainThreadTaskQueue> LoadingTaskQueue();
scoped_refptr<MainThreadTaskQueue> LoadingControlTaskQueue();
scoped_refptr<MainThreadTaskQueue> ThrottleableTaskQueue();
scoped_refptr<MainThreadTaskQueue> DeferrableTaskQueue();
scoped_refptr<MainThreadTaskQueue> PausableTaskQueue();
scoped_refptr<MainThreadTaskQueue> UnpausableTaskQueue();
scoped_refptr<base::sequence_manager::TaskQueue> LoadingTaskQueue();
scoped_refptr<base::sequence_manager::TaskQueue> LoadingControlTaskQueue();
scoped_refptr<base::sequence_manager::TaskQueue> ThrottleableTaskQueue();
scoped_refptr<base::sequence_manager::TaskQueue> DeferrableTaskQueue();
scoped_refptr<base::sequence_manager::TaskQueue> PausableTaskQueue();
scoped_refptr<base::sequence_manager::TaskQueue> UnpausableTaskQueue();
const FrameScheduler::FrameType frame_type_;
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/test/test_mock_time_task_runner.h"
#include "base/time/default_tick_clock.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "testing/perf/perf_test.h"
#include "third_party/blink/renderer/platform/scheduler/base/test/task_queue_manager_for_test.h"
#include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_metrics_helper.h"
#include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h"
namespace blink {
namespace scheduler {
class FrameSchedulerForTest : public FrameSchedulerImpl {
public:
FrameSchedulerForTest(MainThreadSchedulerImpl* main_thread_scheduler,
PageSchedulerImpl* page_scheduler)
: FrameSchedulerImpl(main_thread_scheduler,
page_scheduler,
nullptr,
FrameScheduler::FrameType::kMainFrame) {}
using FrameSchedulerImpl::GetTaskQueueForTesting;
};
class SchedulerPerfTest : public testing::Test {
protected:
void SetUp() override {
message_loop_ = std::make_unique<base::MessageLoop>();
main_thread_scheduler_ = std::make_unique<MainThreadSchedulerImpl>(
base::sequence_manager::TaskQueueManagerForTest::Create(
message_loop_.get(), message_loop_->task_runner(),
base::DefaultTickClock::GetInstance()),
base::nullopt);
metrics_helper_ = std::make_unique<MainThreadMetricsHelper>(
main_thread_scheduler_.get(), base::TimeTicks::Now(), false);
page_scheduler_ = std::make_unique<PageSchedulerImpl>(
nullptr, main_thread_scheduler_.get());
frame_scheduler_ = std::make_unique<FrameSchedulerForTest>(
main_thread_scheduler_.get(), page_scheduler_.get());
}
std::unique_ptr<base::MessageLoop> message_loop_;
std::unique_ptr<MainThreadSchedulerImpl> main_thread_scheduler_;
std::unique_ptr<MainThreadMetricsHelper> metrics_helper_;
std::unique_ptr<PageSchedulerImpl> page_scheduler_;
std::unique_ptr<FrameSchedulerForTest> frame_scheduler_;
};
void Measure(base::OnceCallback<void(size_t)> task,
size_t num_iterations,
std::string name) {
base::TimeTicks start = base::TimeTicks::Now();
base::ThreadTicks start_thread = base::ThreadTicks::Now();
std::move(task).Run(num_iterations);
base::TimeTicks now = base::TimeTicks::Now();
base::ThreadTicks now_thread = base::ThreadTicks::Now();
perf_test::PrintResult(
"task", "", name + " (wall time)",
(now - start).InMicroseconds() / static_cast<double>(num_iterations),
"us/run", true);
perf_test::PrintResult("task", "", name + " (thread time)",
(now_thread - start_thread).InMicroseconds() /
static_cast<double>(num_iterations),
"us/run", true);
}
void RunChainedTask(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
size_t iterations) {
if (iterations <= 1)
return;
task_runner->PostTask(
FROM_HERE, base::BindOnce(&RunChainedTask, task_runner, iterations - 1));
}
TEST_F(SchedulerPerfTest, MeasureTimeCost) {
const size_t num_iterations = 1e5;
Measure(base::BindOnce([](size_t num_iterations) {
base::TimeTicks now;
for (size_t i = 0; i < num_iterations; ++i) {
now = base::TimeTicks::Now();
}
}),
num_iterations, "Measure wall time measurement cost");
Measure(base::BindOnce([](size_t num_iterations) {
base::ThreadTicks now;
for (size_t i = 0; i < num_iterations; ++i) {
now = base::ThreadTicks::Now();
}
}),
num_iterations, "Measure thread time measurement cost");
Measure(
base::BindOnce(
[](MainThreadMetricsHelper* metrics_helper,
FrameSchedulerForTest* frame_scheduler, size_t num_iterations) {
base::sequence_manager::TaskQueue::Task task(
base::sequence_manager::TaskQueue::PostedTask(
base::OnceClosure(), FROM_HERE),
base::TimeTicks());
base::TimeTicks now =
base::TimeTicks() + base::TimeDelta::FromSeconds(1);
base::TimeDelta delta = base::TimeDelta::FromMilliseconds(10);
scoped_refptr<MainThreadTaskQueue> queue =
frame_scheduler->GetTaskQueueForTesting();
for (size_t i = 0; i < num_iterations; ++i) {
metrics_helper->RecordTaskMetrics(queue.get(), task, now,
now + delta, base::nullopt);
now += delta;
}
},
base::Unretained(metrics_helper_.get()),
base::Unretained(frame_scheduler_.get())),
num_iterations, "Measure per-task metric cost");
Measure(
base::BindOnce(
[](scoped_refptr<MainThreadTaskQueue> queue, size_t num_iterations) {
queue->PostTask(FROM_HERE, base::BindOnce(&RunChainedTask, queue,
num_iterations));
base::RunLoop().RunUntilIdle();
},
frame_scheduler_->GetTaskQueueForTesting()),
num_iterations, "Measure a total cost of running a task");
DCHECK(false);
}
} // namespace scheduler
} // namespace blink
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