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

Side by Side Diff: ipc/ipc_perftests.cc

Issue 488003003: Add ChannelProxy benchmark to ipc_perftests. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Resolved conflicts Created 6 years, 3 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "build/build_config.h" 5 #include "build/build_config.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
13 #include "base/pickle.h" 13 #include "base/pickle.h"
14 #include "base/strings/stringprintf.h" 14 #include "base/strings/stringprintf.h"
15 #include "base/test/perf_time_logger.h" 15 #include "base/test/perf_time_logger.h"
16 #include "base/test/test_io_thread.h"
16 #include "base/threading/thread.h" 17 #include "base/threading/thread.h"
17 #include "base/time/time.h" 18 #include "base/time/time.h"
18 #include "ipc/ipc_channel.h" 19 #include "ipc/ipc_channel.h"
19 #include "ipc/ipc_channel_proxy.h" 20 #include "ipc/ipc_channel_proxy.h"
20 #include "ipc/ipc_descriptors.h" 21 #include "ipc/ipc_descriptors.h"
21 #include "ipc/ipc_message_utils.h" 22 #include "ipc/ipc_message_utils.h"
22 #include "ipc/ipc_sender.h" 23 #include "ipc/ipc_sender.h"
23 #include "ipc/ipc_test_base.h" 24 #include "ipc/ipc_test_base.h"
24 25
25 namespace { 26 namespace {
26 27
27 // This test times the roundtrip IPC message cycle. 28 // This test times the roundtrip IPC message cycle.
28 // 29 //
29 // TODO(brettw): Make this test run by default. 30 // TODO(brettw): Make this test run by default.
30 31
31 class IPCChannelPerfTest : public IPCTestBase { 32 class IPCChannelPerfTest : public IPCTestBase {
33 public:
34 virtual scoped_ptr<base::MessageLoop> CreateMessageLoop() OVERRIDE {
35 return make_scoped_ptr(new base::MessageLoop());
viettrungluu 2014/08/27 16:47:18 nit: Same nit as below.
36 }
32 }; 37 };
33 38
34 // This class simply collects stats about abstract "events" (each of which has a 39 // This class simply collects stats about abstract "events" (each of which has a
35 // start time and an end time). 40 // start time and an end time).
36 class EventTimeTracker { 41 class EventTimeTracker {
37 public: 42 public:
38 explicit EventTimeTracker(const char* name) 43 explicit EventTimeTracker(const char* name)
39 : name_(name), 44 : name_(name),
40 count_(0) { 45 count_(0) {
41 } 46 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 return true; 135 return true;
131 } 136 }
132 137
133 private: 138 private:
134 IPC::Channel* channel_; 139 IPC::Channel* channel_;
135 EventTimeTracker latency_tracker_; 140 EventTimeTracker latency_tracker_;
136 }; 141 };
137 142
138 class PerformanceChannelListener : public IPC::Listener { 143 class PerformanceChannelListener : public IPC::Listener {
139 public: 144 public:
140 PerformanceChannelListener() 145 explicit PerformanceChannelListener(const std::string& label)
141 : channel_(NULL), 146 : label_(label),
147 sender_(NULL),
142 msg_count_(0), 148 msg_count_(0),
143 msg_size_(0), 149 msg_size_(0),
144 count_down_(0), 150 count_down_(0),
145 latency_tracker_("Server messages") { 151 latency_tracker_("Server messages") {
146 VLOG(1) << "Server listener up"; 152 VLOG(1) << "Server listener up";
147 } 153 }
148 154
149 virtual ~PerformanceChannelListener() { 155 virtual ~PerformanceChannelListener() {
150 VLOG(1) << "Server listener down"; 156 VLOG(1) << "Server listener down";
151 } 157 }
152 158
153 void Init(IPC::Channel* channel) { 159 void Init(IPC::Sender* sender) {
154 DCHECK(!channel_); 160 DCHECK(!sender_);
155 channel_ = channel; 161 sender_ = sender;
156 } 162 }
157 163
158 // Call this before running the message loop. 164 // Call this before running the message loop.
159 void SetTestParams(int msg_count, size_t msg_size) { 165 void SetTestParams(int msg_count, size_t msg_size) {
160 DCHECK_EQ(0, count_down_); 166 DCHECK_EQ(0, count_down_);
161 msg_count_ = msg_count; 167 msg_count_ = msg_count;
162 msg_size_ = msg_size; 168 msg_size_ = msg_size;
163 count_down_ = msg_count_; 169 count_down_ = msg_count_;
164 payload_ = std::string(msg_size_, 'a'); 170 payload_ = std::string(msg_size_, 'a');
165 } 171 }
166 172
167 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE { 173 virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
168 CHECK(channel_); 174 CHECK(sender_);
169 175
170 PickleIterator iter(message); 176 PickleIterator iter(message);
171 int64 time_internal; 177 int64 time_internal;
172 EXPECT_TRUE(iter.ReadInt64(&time_internal)); 178 EXPECT_TRUE(iter.ReadInt64(&time_internal));
173 int msgid; 179 int msgid;
174 EXPECT_TRUE(iter.ReadInt(&msgid)); 180 EXPECT_TRUE(iter.ReadInt(&msgid));
175 std::string reflected_payload; 181 std::string reflected_payload;
176 EXPECT_TRUE(iter.ReadString(&reflected_payload)); 182 EXPECT_TRUE(iter.ReadString(&reflected_payload));
177 183
178 // Include message deserialization in latency. 184 // Include message deserialization in latency.
179 base::TimeTicks now = base::TimeTicks::Now(); 185 base::TimeTicks now = base::TimeTicks::Now();
180 186
181 if (reflected_payload == "hello") { 187 if (reflected_payload == "hello") {
182 // Start timing on hello. 188 // Start timing on hello.
183 latency_tracker_.Reset(); 189 latency_tracker_.Reset();
184 DCHECK(!perf_logger_.get()); 190 DCHECK(!perf_logger_.get());
185 std::string test_name = base::StringPrintf( 191 std::string test_name =
186 "IPC_Perf_%dx_%u", msg_count_, static_cast<unsigned>(msg_size_)); 192 base::StringPrintf("IPC_%s_Perf_%dx_%u",
193 label_.c_str(),
194 msg_count_,
195 static_cast<unsigned>(msg_size_));
187 perf_logger_.reset(new base::PerfTimeLogger(test_name.c_str())); 196 perf_logger_.reset(new base::PerfTimeLogger(test_name.c_str()));
188 } else { 197 } else {
189 DCHECK_EQ(payload_.size(), reflected_payload.size()); 198 DCHECK_EQ(payload_.size(), reflected_payload.size());
190 199
191 latency_tracker_.AddEvent( 200 latency_tracker_.AddEvent(
192 base::TimeTicks::FromInternalValue(time_internal), now); 201 base::TimeTicks::FromInternalValue(time_internal), now);
193 202
194 CHECK(count_down_ > 0); 203 CHECK(count_down_ > 0);
195 count_down_--; 204 count_down_--;
196 if (count_down_ == 0) { 205 if (count_down_ == 0) {
197 perf_logger_.reset(); // Stop the perf timer now. 206 perf_logger_.reset(); // Stop the perf timer now.
198 latency_tracker_.ShowResults(); 207 latency_tracker_.ShowResults();
199 base::MessageLoop::current()->QuitWhenIdle(); 208 base::MessageLoop::current()->QuitWhenIdle();
200 return true; 209 return true;
201 } 210 }
202 } 211 }
203 212
204 IPC::Message* msg = new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL); 213 IPC::Message* msg = new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL);
205 msg->WriteInt64(base::TimeTicks::Now().ToInternalValue()); 214 msg->WriteInt64(base::TimeTicks::Now().ToInternalValue());
206 msg->WriteInt(count_down_); 215 msg->WriteInt(count_down_);
207 msg->WriteString(payload_); 216 msg->WriteString(payload_);
208 channel_->Send(msg); 217 sender_->Send(msg);
209 return true; 218 return true;
210 } 219 }
211 220
212 private: 221 private:
213 IPC::Channel* channel_; 222 std::string label_;
223 IPC::Sender* sender_;
214 int msg_count_; 224 int msg_count_;
215 size_t msg_size_; 225 size_t msg_size_;
216 226
217 int count_down_; 227 int count_down_;
218 std::string payload_; 228 std::string payload_;
219 EventTimeTracker latency_tracker_; 229 EventTimeTracker latency_tracker_;
220 scoped_ptr<base::PerfTimeLogger> perf_logger_; 230 scoped_ptr<base::PerfTimeLogger> perf_logger_;
221 }; 231 };
222 232
223 TEST_F(IPCChannelPerfTest, Performance) { 233 TEST_F(IPCChannelPerfTest, ChannelPingPong) {
224 Init("PerformanceClient"); 234 Init("PerformanceClient");
225 235
226 // Set up IPC channel and start client. 236 // Set up IPC channel and start client.
227 PerformanceChannelListener listener; 237 PerformanceChannelListener listener("Channel");
228 CreateChannel(&listener); 238 CreateChannel(&listener);
229 listener.Init(channel()); 239 listener.Init(channel());
230 ASSERT_TRUE(ConnectChannel()); 240 ASSERT_TRUE(ConnectChannel());
231 ASSERT_TRUE(StartClient()); 241 ASSERT_TRUE(StartClient());
232 242
233 // Test several sizes. We use 12^N for message size, and limit the message 243 // Test several sizes. We use 12^N for message size, and limit the message
234 // count to keep the test duration reasonable. 244 // count to keep the test duration reasonable.
235 const size_t kMsgSize[5] = {12, 144, 1728, 20736, 248832}; 245 const size_t kMsgSize[5] = {12, 144, 1728, 20736, 248832};
236 const int kMessageCount[5] = {50000, 50000, 50000, 12000, 1000}; 246 const int kMessageCount[5] = {50000, 50000, 50000, 12000, 1000};
237 247
(...skipping 29 matching lines...) Expand all
267 ChannelReflectorListener listener; 277 ChannelReflectorListener listener;
268 scoped_ptr<IPC::Channel> channel(IPC::Channel::CreateClient( 278 scoped_ptr<IPC::Channel> channel(IPC::Channel::CreateClient(
269 IPCTestBase::GetChannelName("PerformanceClient"), &listener)); 279 IPCTestBase::GetChannelName("PerformanceClient"), &listener));
270 listener.Init(channel.get()); 280 listener.Init(channel.get());
271 CHECK(channel->Connect()); 281 CHECK(channel->Connect());
272 282
273 base::MessageLoop::current()->Run(); 283 base::MessageLoop::current()->Run();
274 return 0; 284 return 0;
275 } 285 }
276 286
287 TEST_F(IPCChannelPerfTest, ChannelProxyPingPong) {
288 Init("PerformanceClient");
289
290 base::TestIOThread io_thread((base::TestIOThread::kAutoStart));
viettrungluu 2014/08/27 16:47:18 nit: I don't think there's any need for the extra
Hajime Morrita 2014/08/27 17:47:43 Done.
291
292 // Set up IPC channel and start client.
293 PerformanceChannelListener listener("ChannelProxy");
294 CreateChannelProxy(&listener, io_thread.task_runner());
295 listener.Init(channel_proxy());
296 ASSERT_TRUE(StartClient());
297
298 // Test several sizes. We use 12^N for message size, and limit the message
299 // count to keep the test duration reasonable.
300 const size_t kMsgSize[5] = {12, 144, 1728, 20736, 248832};
301 const int kMessageCount[5] = {50000, 50000, 50000, 12000, 1000};
302
303 for (size_t i = 0; i < 5; i++) {
304 listener.SetTestParams(kMessageCount[i], kMsgSize[i]);
305
306 // This initial message will kick-start the ping-pong of messages.
307 IPC::Message* message =
308 new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL);
309 message->WriteInt64(base::TimeTicks::Now().ToInternalValue());
310 message->WriteInt(-1);
311 message->WriteString("hello");
312 sender()->Send(message);
313
314 // Run message loop.
315 base::MessageLoop::current()->Run();
316 }
317
318 // Send quit message.
319 IPC::Message* message = new IPC::Message(0, 2, IPC::Message::PRIORITY_NORMAL);
320 message->WriteInt64(base::TimeTicks::Now().ToInternalValue());
321 message->WriteInt(-1);
322 message->WriteString("quit");
323 sender()->Send(message);
324
325 EXPECT_TRUE(WaitForClientShutdown());
326 DestroyChannelProxy();
327 }
328
277 } // namespace 329 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698