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

Side by Side Diff: base/threading/thread_perftest.cc

Issue 2791243002: Rewrite base::Bind into base::BindOnce on trivial cases in base (Closed)
Patch Set: rebase Created 3 years, 8 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 | « base/threading/thread.cc ('k') | base/threading/thread_unittest.cc » ('j') | 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 <stddef.h> 5 #include <stddef.h>
6 6
7 #include <memory> 7 #include <memory>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/base_switches.h" 10 #include "base/base_switches.h"
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 void TimeOnThread(base::ThreadTicks* ticks, base::WaitableEvent* done) { 60 void TimeOnThread(base::ThreadTicks* ticks, base::WaitableEvent* done) {
61 *ticks = base::ThreadTicks::Now(); 61 *ticks = base::ThreadTicks::Now();
62 done->Signal(); 62 done->Signal();
63 } 63 }
64 64
65 base::ThreadTicks ThreadNow(const base::Thread& thread) { 65 base::ThreadTicks ThreadNow(const base::Thread& thread) {
66 base::WaitableEvent done(WaitableEvent::ResetPolicy::AUTOMATIC, 66 base::WaitableEvent done(WaitableEvent::ResetPolicy::AUTOMATIC,
67 WaitableEvent::InitialState::NOT_SIGNALED); 67 WaitableEvent::InitialState::NOT_SIGNALED);
68 base::ThreadTicks ticks; 68 base::ThreadTicks ticks;
69 thread.task_runner()->PostTask( 69 thread.task_runner()->PostTask(
70 FROM_HERE, base::Bind(&ThreadPerfTest::TimeOnThread, 70 FROM_HERE, base::BindOnce(&ThreadPerfTest::TimeOnThread,
71 base::Unretained(this), &ticks, &done)); 71 base::Unretained(this), &ticks, &done));
72 done.Wait(); 72 done.Wait();
73 return ticks; 73 return ticks;
74 } 74 }
75 75
76 void RunPingPongTest(const std::string& name, unsigned num_threads) { 76 void RunPingPongTest(const std::string& name, unsigned num_threads) {
77 // Create threads and collect starting cpu-time for each thread. 77 // Create threads and collect starting cpu-time for each thread.
78 std::vector<base::ThreadTicks> thread_starts; 78 std::vector<base::ThreadTicks> thread_starts;
79 while (threads_.size() < num_threads) { 79 while (threads_.size() < num_threads) {
80 threads_.push_back(MakeUnique<base::Thread>("PingPonger")); 80 threads_.push_back(MakeUnique<base::Thread>("PingPonger"));
81 threads_.back()->Start(); 81 threads_.back()->Start();
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 base::Thread* NextThread(int count) { 131 base::Thread* NextThread(int count) {
132 return threads_[count % threads_.size()].get(); 132 return threads_[count % threads_.size()].get();
133 } 133 }
134 134
135 void PingPong(int hops) override { 135 void PingPong(int hops) override {
136 if (!hops) { 136 if (!hops) {
137 FinishMeasurement(); 137 FinishMeasurement();
138 return; 138 return;
139 } 139 }
140 NextThread(hops)->task_runner()->PostTask( 140 NextThread(hops)->task_runner()->PostTask(
141 FROM_HERE, base::Bind(&ThreadPerfTest::PingPong, base::Unretained(this), 141 FROM_HERE, base::BindOnce(&ThreadPerfTest::PingPong,
142 hops - 1)); 142 base::Unretained(this), hops - 1));
143 } 143 }
144 }; 144 };
145 145
146 // This tries to test the 'best-case' as well as the 'worst-case' task posting 146 // This tries to test the 'best-case' as well as the 'worst-case' task posting
147 // performance. The best-case keeps one thread alive such that it never yeilds, 147 // performance. The best-case keeps one thread alive such that it never yeilds,
148 // while the worse-case forces a context switch for every task. Four threads are 148 // while the worse-case forces a context switch for every task. Four threads are
149 // used to ensure the threads do yeild (with just two it might be possible for 149 // used to ensure the threads do yeild (with just two it might be possible for
150 // both threads to stay awake if they can signal each other fast enough). 150 // both threads to stay awake if they can signal each other fast enough).
151 TEST_F(TaskPerfTest, TaskPingPong) { 151 TEST_F(TaskPerfTest, TaskPingPong) {
152 RunPingPongTest("1_Task_Threads", 1); 152 RunPingPongTest("1_Task_Threads", 1);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 // Once we are done, all threads will signal as hops passes zero. 203 // Once we are done, all threads will signal as hops passes zero.
204 // We only signal completion once, on the thread that reaches zero. 204 // We only signal completion once, on the thread that reaches zero.
205 if (!my_hops) 205 if (!my_hops)
206 FinishMeasurement(); 206 FinishMeasurement();
207 } 207 }
208 208
209 void PingPong(int hops) override { 209 void PingPong(int hops) override {
210 remaining_hops_ = hops; 210 remaining_hops_ = hops;
211 for (size_t i = 0; i < threads_.size(); i++) { 211 for (size_t i = 0; i < threads_.size(); i++) {
212 threads_[i]->task_runner()->PostTask( 212 threads_[i]->task_runner()->PostTask(
213 FROM_HERE, base::Bind(&EventPerfTest::WaitAndSignalOnThread, 213 FROM_HERE, base::BindOnce(&EventPerfTest::WaitAndSignalOnThread,
214 base::Unretained(this), i)); 214 base::Unretained(this), i));
215 } 215 }
216 216
217 // Kick off the Signal ping-ponging. 217 // Kick off the Signal ping-ponging.
218 events_.front()->Signal(); 218 events_.front()->Signal();
219 } 219 }
220 220
221 int remaining_hops_; 221 int remaining_hops_;
222 std::vector<std::unique_ptr<WaitableEventType>> events_; 222 std::vector<std::unique_ptr<WaitableEventType>> events_;
223 }; 223 };
224 224
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 typedef EventPerfTest<PthreadEvent> PthreadEventPerfTest; 314 typedef EventPerfTest<PthreadEvent> PthreadEventPerfTest;
315 TEST_F(PthreadEventPerfTest, EventPingPong) { 315 TEST_F(PthreadEventPerfTest, EventPingPong) {
316 RunPingPongTest("4_PthreadCondVar_Threads", 4); 316 RunPingPongTest("4_PthreadCondVar_Threads", 4);
317 } 317 }
318 318
319 #endif 319 #endif
320 320
321 } // namespace 321 } // namespace
322 322
323 } // namespace base 323 } // namespace base
OLDNEW
« no previous file with comments | « base/threading/thread.cc ('k') | base/threading/thread_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698