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

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: use duration instead 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 #include "platform/wtf/PtrUtil.h" 20 #include "platform/wtf/PtrUtil.h"
21 21
22 static const double kLongTaskTraceEventThreshold = 0.05;
23
22 namespace blink { 24 namespace blink {
23 namespace scheduler { 25 namespace scheduler {
24 26
25 namespace { 27 namespace {
26 const size_t kRecordRecordTaskDelayHistogramsEveryNTasks = 10; 28 const size_t kRecordRecordTaskDelayHistogramsEveryNTasks = 10;
27 29
28 void RecordDelayedTaskLateness(base::TimeDelta lateness) { 30 void RecordDelayedTaskLateness(base::TimeDelta lateness) {
29 UMA_HISTOGRAM_TIMES("RendererScheduler.TaskQueueManager.DelayedTaskLateness", 31 UMA_HISTOGRAM_TIMES("RendererScheduler.TaskQueueManager.DelayedTaskLateness",
30 lateness); 32 lateness);
31 } 33 }
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after
528 currently_executing_task_queue_; 530 currently_executing_task_queue_;
529 currently_executing_task_queue_ = queue; 531 currently_executing_task_queue_ = queue;
530 task_annotator_.RunTask("TaskQueueManager::PostTask", &pending_task); 532 task_annotator_.RunTask("TaskQueueManager::PostTask", &pending_task);
531 // Detect if the TaskQueueManager just got deleted. If this happens we must 533 // Detect if the TaskQueueManager just got deleted. If this happens we must
532 // not access any member variables after this point. 534 // not access any member variables after this point.
533 if (protect->HasOneRef()) 535 if (protect->HasOneRef())
534 return ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED; 536 return ProcessTaskResult::TASK_QUEUE_MANAGER_DELETED;
535 537
536 currently_executing_task_queue_ = prev_executing_task_queue; 538 currently_executing_task_queue_ = prev_executing_task_queue;
537 539
538 540 double task_end_time = 0;
539 if (queue->GetShouldNotifyObservers()) { 541 if (queue->GetShouldNotifyObservers()) {
540 if (task_start_time) { 542 if (task_start_time) {
541 *time_after_task = real_time_domain()->Now(); 543 *time_after_task = real_time_domain()->Now();
542 double task_end_time = MonotonicTimeInSeconds(*time_after_task); 544 task_end_time = MonotonicTimeInSeconds(*time_after_task);
543 545
544 queue->OnTaskCompleted( 546 queue->OnTaskCompleted(
545 base::TimeTicks() + base::TimeDelta::FromSecondsD(task_start_time), 547 base::TimeTicks() + base::TimeDelta::FromSecondsD(task_start_time),
546 base::TimeTicks() + base::TimeDelta::FromSecondsD(task_end_time)); 548 base::TimeTicks() + base::TimeDelta::FromSecondsD(task_end_time));
547 549
548 for (auto& observer : task_time_observers_) 550 for (auto& observer : task_time_observers_)
549 observer.DidProcessTask(task_start_time, task_end_time); 551 observer.DidProcessTask(task_start_time, task_end_time);
550 } 552 }
551 553
552 for (auto& observer : task_observers_) 554 for (auto& observer : task_observers_)
553 observer.DidProcessTask(pending_task); 555 observer.DidProcessTask(pending_task);
554 queue->NotifyDidProcessTask(pending_task); 556 queue->NotifyDidProcessTask(pending_task);
555 } 557 }
556 558
559 if (task_start_time && task_end_time &&
560 task_end_time - task_start_time > kLongTaskTraceEventThreshold) {
561 TRACE_EVENT_INSTANT1("blink", "LongTask", TRACE_EVENT_SCOPE_THREAD,
562 "duration", task_end_time - task_start_time);
563 }
564
557 return ProcessTaskResult::EXECUTED; 565 return ProcessTaskResult::EXECUTED;
558 } 566 }
559 567
560 void TaskQueueManager::MaybeRecordTaskDelayHistograms( 568 void TaskQueueManager::MaybeRecordTaskDelayHistograms(
561 const internal::TaskQueueImpl::Task& pending_task, 569 const internal::TaskQueueImpl::Task& pending_task,
562 const internal::TaskQueueImpl* queue) { 570 const internal::TaskQueueImpl* queue) {
563 if ((task_count_++ % kRecordRecordTaskDelayHistogramsEveryNTasks) != 0) 571 if ((task_count_++ % kRecordRecordTaskDelayHistogramsEveryNTasks) != 0)
564 return; 572 return;
565 573
566 // Record delayed task lateness and immediate task queuing durations. 574 // Record delayed task lateness and immediate task queuing durations.
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
707 TimeDomain* time_domain = queue->GetTimeDomain(); 715 TimeDomain* time_domain = queue->GetTimeDomain();
708 if (time_domain_now.find(time_domain) == time_domain_now.end()) 716 if (time_domain_now.find(time_domain) == time_domain_now.end())
709 time_domain_now.insert(std::make_pair(time_domain, time_domain->Now())); 717 time_domain_now.insert(std::make_pair(time_domain, time_domain->Now()));
710 queue->GetTaskQueueImpl()->SweepCanceledDelayedTasks( 718 queue->GetTaskQueueImpl()->SweepCanceledDelayedTasks(
711 time_domain_now[time_domain]); 719 time_domain_now[time_domain]);
712 } 720 }
713 } 721 }
714 722
715 } // namespace scheduler 723 } // namespace scheduler
716 } // namespace blink 724 } // 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