Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(90)

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/base/task_queue_manager.cc

Issue 2966073003: Long tasks: add a trace event for long tasks (Closed)
Patch Set: remove unrelated files Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/core/timing/Performance.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "platform/scheduler/base/task_queue_manager.h" 5 #include "platform/scheduler/base/task_queue_manager.h"
6 6
7 #include <queue> 7 #include <queue>
8 #include <set> 8 #include <set>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/metrics/histogram_macros.h" 11 #include "base/metrics/histogram_macros.h"
12 #include "base/trace_event/trace_event.h" 12 #include "base/trace_event/trace_event.h"
13 #include "platform/scheduler/base/real_time_domain.h" 13 #include "platform/scheduler/base/real_time_domain.h"
14 #include "platform/scheduler/base/task_queue_impl.h" 14 #include "platform/scheduler/base/task_queue_impl.h"
15 #include "platform/scheduler/base/task_queue_manager_delegate.h" 15 #include "platform/scheduler/base/task_queue_manager_delegate.h"
16 #include "platform/scheduler/base/task_queue_selector.h" 16 #include "platform/scheduler/base/task_queue_selector.h"
17 #include "platform/scheduler/base/task_time_observer.h" 17 #include "platform/scheduler/base/task_time_observer.h"
18 #include "platform/scheduler/base/work_queue.h" 18 #include "platform/scheduler/base/work_queue.h"
19 #include "platform/scheduler/base/work_queue_sets.h" 19 #include "platform/scheduler/base/work_queue_sets.h"
20 20
21 static const double kLongTaskTraceEventThreshold = 0.05;
22
21 namespace blink { 23 namespace blink {
22 namespace scheduler { 24 namespace scheduler {
23 25
24 namespace { 26 namespace {
25 const size_t kRecordRecordTaskDelayHistogramsEveryNTasks = 10; 27 const size_t kRecordRecordTaskDelayHistogramsEveryNTasks = 10;
26 28
27 void RecordDelayedTaskLateness(base::TimeDelta lateness) { 29 void RecordDelayedTaskLateness(base::TimeDelta lateness) {
28 UMA_HISTOGRAM_TIMES("RendererScheduler.TaskQueueManager.DelayedTaskLateness", 30 UMA_HISTOGRAM_TIMES("RendererScheduler.TaskQueueManager.DelayedTaskLateness",
29 lateness); 31 lateness);
30 } 32 }
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 currently_executing_task_queue_; 531 currently_executing_task_queue_;
530 currently_executing_task_queue_ = queue; 532 currently_executing_task_queue_ = queue;
531 task_annotator_.RunTask("TaskQueueManager::PostTask", &pending_task); 533 task_annotator_.RunTask("TaskQueueManager::PostTask", &pending_task);
532 // Detect if the TaskQueueManager just got deleted. If this happens we must 534 // Detect if the TaskQueueManager just got deleted. If this happens we must
533 // not access any member variables after this point. 535 // not access any member variables after this point.
534 if (protect->HasOneRef()) 536 if (protect->HasOneRef())
535 return ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED; 537 return ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED;
536 538
537 currently_executing_task_queue_ = prev_executing_task_queue; 539 currently_executing_task_queue_ = prev_executing_task_queue;
538 540
539 541 double task_end_time = 0;
540 if (queue->GetShouldNotifyObservers()) { 542 if (queue->GetShouldNotifyObservers()) {
541 if (task_start_time) { 543 if (task_start_time) {
542 *time_after_task = real_time_domain()->Now(); 544 *time_after_task = real_time_domain()->Now();
543 double task_end_time = MonotonicTimeInSeconds(*time_after_task); 545 task_end_time = MonotonicTimeInSeconds(*time_after_task);
544 for (auto& observer : task_time_observers_) 546 for (auto& observer : task_time_observers_)
545 observer.DidProcessTask(queue, task_start_time, task_end_time); 547 observer.DidProcessTask(queue, task_start_time, task_end_time);
546 } 548 }
547 549
548 for (auto& observer : task_observers_) 550 for (auto& observer : task_observers_)
549 observer.DidProcessTask(pending_task); 551 observer.DidProcessTask(pending_task);
550 queue->NotifyDidProcessTask(pending_task); 552 queue->NotifyDidProcessTask(pending_task);
551 } 553 }
552 554
555 if (task_start_time && task_end_time &&
556 task_end_time - task_start_time > kLongTaskTraceEventThreshold) {
557 TRACE_EVENT2("blink", "LongTask", "start_time", task_start_time, "end_time",
altimin 2017/07/07 18:24:17 This will be shown in the UI as an extremely short
caseq 2017/07/07 18:54:44 +1 to this, I don't think it makes sense in the pr
Liquan (Max) Gu 2017/07/07 20:01:25 I have changed to emit an instant event. From th
558 task_end_time);
559 }
560
553 return ProcessTaskResult::EXECUTED; 561 return ProcessTaskResult::EXECUTED;
554 } 562 }
555 563
556 void TaskQueueManager::MaybeRecordTaskDelayHistograms( 564 void TaskQueueManager::MaybeRecordTaskDelayHistograms(
557 const internal::TaskQueueImpl::Task& pending_task, 565 const internal::TaskQueueImpl::Task& pending_task,
558 const internal::TaskQueueImpl* queue) { 566 const internal::TaskQueueImpl* queue) {
559 if ((task_count_++ % kRecordRecordTaskDelayHistogramsEveryNTasks) != 0) 567 if ((task_count_++ % kRecordRecordTaskDelayHistogramsEveryNTasks) != 0)
560 return; 568 return;
561 569
562 // Record delayed task lateness and immediate task queuing durations. 570 // Record delayed task lateness and immediate task queuing durations.
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
704 for (const scoped_refptr<internal::TaskQueueImpl>& queue : queues_) { 712 for (const scoped_refptr<internal::TaskQueueImpl>& queue : queues_) {
705 TimeDomain* time_domain = queue->GetTimeDomain(); 713 TimeDomain* time_domain = queue->GetTimeDomain();
706 if (time_domain_now.find(time_domain) == time_domain_now.end()) 714 if (time_domain_now.find(time_domain) == time_domain_now.end())
707 time_domain_now.insert(std::make_pair(time_domain, time_domain->Now())); 715 time_domain_now.insert(std::make_pair(time_domain, time_domain->Now()));
708 queue->SweepCanceledDelayedTasks(time_domain_now[time_domain]); 716 queue->SweepCanceledDelayedTasks(time_domain_now[time_domain]);
709 } 717 }
710 } 718 }
711 719
712 } // namespace scheduler 720 } // namespace scheduler
713 } // namespace blink 721 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/timing/Performance.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698