OLD | NEW |
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 "base/base_switches.h" | 5 #include "base/base_switches.h" |
6 #include "base/bind.h" | 6 #include "base/bind.h" |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/memory/scoped_vector.h" | 8 #include "base/memory/scoped_vector.h" |
9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
10 #include "base/synchronization/condition_variable.h" | 10 #include "base/synchronization/condition_variable.h" |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 TEST_F(TaskObserverPerfTest, TaskPingPong) { | 167 TEST_F(TaskObserverPerfTest, TaskPingPong) { |
168 RunPingPongTest("1_Task_Threads_With_Observer", 1); | 168 RunPingPongTest("1_Task_Threads_With_Observer", 1); |
169 RunPingPongTest("4_Task_Threads_With_Observer", 4); | 169 RunPingPongTest("4_Task_Threads_With_Observer", 4); |
170 } | 170 } |
171 | 171 |
172 // Class to test our WaitableEvent performance by signaling back and fort. | 172 // Class to test our WaitableEvent performance by signaling back and fort. |
173 // WaitableEvent is templated so we can also compare with other versions. | 173 // WaitableEvent is templated so we can also compare with other versions. |
174 template <typename WaitableEventType> | 174 template <typename WaitableEventType> |
175 class EventPerfTest : public ThreadPerfTest { | 175 class EventPerfTest : public ThreadPerfTest { |
176 public: | 176 public: |
177 virtual void Init() override { | 177 void Init() override { |
178 for (size_t i = 0; i < threads_.size(); i++) | 178 for (size_t i = 0; i < threads_.size(); i++) |
179 events_.push_back(new WaitableEventType(false, false)); | 179 events_.push_back(new WaitableEventType(false, false)); |
180 } | 180 } |
181 | 181 |
182 virtual void Reset() override { events_.clear(); } | 182 void Reset() override { events_.clear(); } |
183 | 183 |
184 void WaitAndSignalOnThread(size_t event) { | 184 void WaitAndSignalOnThread(size_t event) { |
185 size_t next_event = (event + 1) % events_.size(); | 185 size_t next_event = (event + 1) % events_.size(); |
186 int my_hops = 0; | 186 int my_hops = 0; |
187 do { | 187 do { |
188 events_[event]->Wait(); | 188 events_[event]->Wait(); |
189 my_hops = --remaining_hops_; // We own 'hops' between Wait and Signal. | 189 my_hops = --remaining_hops_; // We own 'hops' between Wait and Signal. |
190 events_[next_event]->Signal(); | 190 events_[next_event]->Signal(); |
191 } while (my_hops > 0); | 191 } while (my_hops > 0); |
192 // Once we are done, all threads will signal as hops passes zero. | 192 // Once we are done, all threads will signal as hops passes zero. |
193 // We only signal completion once, on the thread that reaches zero. | 193 // We only signal completion once, on the thread that reaches zero. |
194 if (!my_hops) | 194 if (!my_hops) |
195 FinishMeasurement(); | 195 FinishMeasurement(); |
196 } | 196 } |
197 | 197 |
198 virtual void PingPong(int hops) override { | 198 void PingPong(int hops) override { |
199 remaining_hops_ = hops; | 199 remaining_hops_ = hops; |
200 for (size_t i = 0; i < threads_.size(); i++) { | 200 for (size_t i = 0; i < threads_.size(); i++) { |
201 threads_[i]->message_loop_proxy()->PostTask( | 201 threads_[i]->message_loop_proxy()->PostTask( |
202 FROM_HERE, | 202 FROM_HERE, |
203 base::Bind(&EventPerfTest::WaitAndSignalOnThread, | 203 base::Bind(&EventPerfTest::WaitAndSignalOnThread, |
204 base::Unretained(this), | 204 base::Unretained(this), |
205 i)); | 205 i)); |
206 } | 206 } |
207 | 207 |
208 // Kick off the Signal ping-ponging. | 208 // Kick off the Signal ping-ponging. |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 typedef EventPerfTest<PthreadEvent> PthreadEventPerfTest; | 303 typedef EventPerfTest<PthreadEvent> PthreadEventPerfTest; |
304 TEST_F(PthreadEventPerfTest, EventPingPong) { | 304 TEST_F(PthreadEventPerfTest, EventPingPong) { |
305 RunPingPongTest("4_PthreadCondVar_Threads", 4); | 305 RunPingPongTest("4_PthreadCondVar_Threads", 4); |
306 } | 306 } |
307 | 307 |
308 #endif | 308 #endif |
309 | 309 |
310 } // namespace | 310 } // namespace |
311 | 311 |
312 } // namespace base | 312 } // namespace base |
OLD | NEW |