OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 // This tests the performance of the C API. | 5 // This tests the performance of the C API. |
6 | 6 |
7 #include "mojo/public/c/system/core.h" | 7 #include "mojo/public/c/system/core.h" |
8 | 8 |
9 #include <assert.h> | 9 #include <assert.h> |
10 #include <stddef.h> | 10 #include <stddef.h> |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 delete writers[i]; | 205 delete writers[i]; |
206 } | 206 } |
207 writers.clear(); | 207 writers.clear(); |
208 int64_t num_reads = 0; | 208 int64_t num_reads = 0; |
209 for (unsigned i = 0; i < num_readers; i++) { | 209 for (unsigned i = 0; i < num_readers; i++) { |
210 num_reads += readers[i]->num_reads(); | 210 num_reads += readers[i]->num_reads(); |
211 delete readers[i]; | 211 delete readers[i]; |
212 } | 212 } |
213 readers.clear(); | 213 readers.clear(); |
214 | 214 |
215 char test_name[200]; | 215 char sub_test_name[200]; |
216 sprintf(test_name, | 216 sprintf(sub_test_name, "%uw_%ur_%ubytes", num_writers, num_readers, |
217 "MessagePipe_Threaded_Writes_%uw_%ur_%ubytes", | |
218 num_writers, | |
219 num_readers, | |
220 static_cast<unsigned>(num_bytes)); | 217 static_cast<unsigned>(num_bytes)); |
221 mojo::test::LogPerfResult( | 218 mojo::test::LogPerfResult( |
222 test_name, | 219 "MessagePipe_Threaded_Writes", sub_test_name, |
223 1000000.0 * static_cast<double>(num_writes) / (end_time - start_time), | 220 1000000.0 * static_cast<double>(num_writes) / (end_time - start_time), |
224 "writes/second"); | 221 "writes/second"); |
225 sprintf(test_name, | |
226 "MessagePipe_Threaded_Reads_%uw_%ur_%ubytes", | |
227 num_writers, | |
228 num_readers, | |
229 static_cast<unsigned>(num_bytes)); | |
230 mojo::test::LogPerfResult( | 222 mojo::test::LogPerfResult( |
231 test_name, | 223 "MessagePipe_Threaded_Reads", sub_test_name, |
232 1000000.0 * static_cast<double>(num_reads) / (end_time - start_time), | 224 1000000.0 * static_cast<double>(num_reads) / (end_time - start_time), |
233 "reads/second"); | 225 "reads/second"); |
234 } | 226 } |
235 #endif // !defined(WIN32) | 227 #endif // !defined(WIN32) |
236 | 228 |
237 MojoHandle h0_; | 229 MojoHandle h0_; |
238 MojoHandle h1_; | 230 MojoHandle h1_; |
239 | 231 |
240 void* buffer_; | 232 void* buffer_; |
241 uint32_t num_bytes_; | 233 uint32_t num_bytes_; |
242 | 234 |
243 private: | 235 private: |
244 #if !defined(WIN32) | 236 #if !defined(WIN32) |
245 void Sleep(int64_t microseconds) { | 237 void Sleep(int64_t microseconds) { |
246 struct timespec req = { | 238 struct timespec req = { |
247 static_cast<time_t>(microseconds / 1000000), // Seconds. | 239 static_cast<time_t>(microseconds / 1000000), // Seconds. |
248 static_cast<long>(microseconds % 1000000) * 1000L // Nanoseconds. | 240 static_cast<long>(microseconds % 1000000) * 1000L // Nanoseconds. |
249 }; | 241 }; |
250 int rv = nanosleep(&req, NULL); | 242 int rv = nanosleep(&req, NULL); |
251 MOJO_ALLOW_UNUSED_LOCAL(rv); | 243 MOJO_ALLOW_UNUSED_LOCAL(rv); |
252 assert(rv == 0); | 244 assert(rv == 0); |
253 } | 245 } |
254 #endif // !defined(WIN32) | 246 #endif // !defined(WIN32) |
255 | 247 |
256 MOJO_DISALLOW_COPY_AND_ASSIGN(CorePerftest); | 248 MOJO_DISALLOW_COPY_AND_ASSIGN(CorePerftest); |
257 }; | 249 }; |
258 | 250 |
259 // A no-op test so we can compare performance. | 251 // A no-op test so we can compare performance. |
260 TEST_F(CorePerftest, NoOp) { | 252 TEST_F(CorePerftest, NoOp) { |
261 mojo::test::IterateAndReportPerf("NoOp", &CorePerftest::NoOp, this); | 253 mojo::test::IterateAndReportPerf("Iterate_NoOp", nullptr, &CorePerftest::NoOp, |
| 254 this); |
262 } | 255 } |
263 | 256 |
264 TEST_F(CorePerftest, MessagePipe_CreateAndClose) { | 257 TEST_F(CorePerftest, MessagePipe_CreateAndClose) { |
265 mojo::test::IterateAndReportPerf("MessagePipe_CreateAndClose", | 258 mojo::test::IterateAndReportPerf("MessagePipe_CreateAndClose", nullptr, |
266 &CorePerftest::MessagePipe_CreateAndClose, | 259 &CorePerftest::MessagePipe_CreateAndClose, |
267 this); | 260 this); |
268 } | 261 } |
269 | 262 |
270 TEST_F(CorePerftest, MessagePipe_WriteAndRead) { | 263 TEST_F(CorePerftest, MessagePipe_WriteAndRead) { |
271 MojoResult result = MojoCreateMessagePipe(NULL, &h0_, &h1_); | 264 MojoResult result = MojoCreateMessagePipe(NULL, &h0_, &h1_); |
272 MOJO_ALLOW_UNUSED_LOCAL(result); | 265 MOJO_ALLOW_UNUSED_LOCAL(result); |
273 assert(result == MOJO_RESULT_OK); | 266 assert(result == MOJO_RESULT_OK); |
274 char buffer[10000] = {0}; | 267 char buffer[10000] = {0}; |
275 buffer_ = buffer; | 268 buffer_ = buffer; |
276 num_bytes_ = 10u; | 269 num_bytes_ = 10u; |
277 mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead_10bytes", | 270 mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead", "10bytes", |
278 &CorePerftest::MessagePipe_WriteAndRead, | 271 &CorePerftest::MessagePipe_WriteAndRead, |
279 this); | 272 this); |
280 num_bytes_ = 100u; | 273 num_bytes_ = 100u; |
281 mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead_100bytes", | 274 mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead", "100bytes", |
282 &CorePerftest::MessagePipe_WriteAndRead, | 275 &CorePerftest::MessagePipe_WriteAndRead, |
283 this); | 276 this); |
284 num_bytes_ = 1000u; | 277 num_bytes_ = 1000u; |
285 mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead_1000bytes", | 278 mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead", "1000bytes", |
286 &CorePerftest::MessagePipe_WriteAndRead, | 279 &CorePerftest::MessagePipe_WriteAndRead, |
287 this); | 280 this); |
288 num_bytes_ = 10000u; | 281 num_bytes_ = 10000u; |
289 mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead_10000bytes", | 282 mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead", "10000bytes", |
290 &CorePerftest::MessagePipe_WriteAndRead, | 283 &CorePerftest::MessagePipe_WriteAndRead, |
291 this); | 284 this); |
292 result = MojoClose(h0_); | 285 result = MojoClose(h0_); |
293 assert(result == MOJO_RESULT_OK); | 286 assert(result == MOJO_RESULT_OK); |
294 result = MojoClose(h1_); | 287 result = MojoClose(h1_); |
295 assert(result == MOJO_RESULT_OK); | 288 assert(result == MOJO_RESULT_OK); |
296 } | 289 } |
297 | 290 |
298 TEST_F(CorePerftest, MessagePipe_EmptyRead) { | 291 TEST_F(CorePerftest, MessagePipe_EmptyRead) { |
299 MojoResult result = MojoCreateMessagePipe(NULL, &h0_, &h1_); | 292 MojoResult result = MojoCreateMessagePipe(NULL, &h0_, &h1_); |
300 MOJO_ALLOW_UNUSED_LOCAL(result); | 293 MOJO_ALLOW_UNUSED_LOCAL(result); |
301 assert(result == MOJO_RESULT_OK); | 294 assert(result == MOJO_RESULT_OK); |
302 mojo::test::IterateAndReportPerf( | 295 mojo::test::IterateAndReportPerf("MessagePipe_EmptyRead", nullptr, |
303 "MessagePipe_EmptyRead", &CorePerftest::MessagePipe_EmptyRead, this); | 296 &CorePerftest::MessagePipe_EmptyRead, this); |
304 result = MojoClose(h0_); | 297 result = MojoClose(h0_); |
305 assert(result == MOJO_RESULT_OK); | 298 assert(result == MOJO_RESULT_OK); |
306 result = MojoClose(h1_); | 299 result = MojoClose(h1_); |
307 assert(result == MOJO_RESULT_OK); | 300 assert(result == MOJO_RESULT_OK); |
308 } | 301 } |
309 | 302 |
310 #if !defined(WIN32) | 303 #if !defined(WIN32) |
311 TEST_F(CorePerftest, MessagePipe_Threaded) { | 304 TEST_F(CorePerftest, MessagePipe_Threaded) { |
312 DoMessagePipeThreadedTest(1u, 1u, 100u); | 305 DoMessagePipeThreadedTest(1u, 1u, 100u); |
313 DoMessagePipeThreadedTest(2u, 2u, 100u); | 306 DoMessagePipeThreadedTest(2u, 2u, 100u); |
314 DoMessagePipeThreadedTest(3u, 3u, 100u); | 307 DoMessagePipeThreadedTest(3u, 3u, 100u); |
315 DoMessagePipeThreadedTest(10u, 10u, 100u); | 308 DoMessagePipeThreadedTest(10u, 10u, 100u); |
316 DoMessagePipeThreadedTest(10u, 1u, 100u); | 309 DoMessagePipeThreadedTest(10u, 1u, 100u); |
317 DoMessagePipeThreadedTest(1u, 10u, 100u); | 310 DoMessagePipeThreadedTest(1u, 10u, 100u); |
318 | 311 |
319 // For comparison of overhead: | 312 // For comparison of overhead: |
320 DoMessagePipeThreadedTest(1u, 1u, 10u); | 313 DoMessagePipeThreadedTest(1u, 1u, 10u); |
321 // 100 was done above. | 314 // 100 was done above. |
322 DoMessagePipeThreadedTest(1u, 1u, 1000u); | 315 DoMessagePipeThreadedTest(1u, 1u, 1000u); |
323 DoMessagePipeThreadedTest(1u, 1u, 10000u); | 316 DoMessagePipeThreadedTest(1u, 1u, 10000u); |
324 | 317 |
325 DoMessagePipeThreadedTest(3u, 3u, 10u); | 318 DoMessagePipeThreadedTest(3u, 3u, 10u); |
326 // 100 was done above. | 319 // 100 was done above. |
327 DoMessagePipeThreadedTest(3u, 3u, 1000u); | 320 DoMessagePipeThreadedTest(3u, 3u, 1000u); |
328 DoMessagePipeThreadedTest(3u, 3u, 10000u); | 321 DoMessagePipeThreadedTest(3u, 3u, 10000u); |
329 } | 322 } |
330 #endif // !defined(WIN32) | 323 #endif // !defined(WIN32) |
331 | 324 |
332 } // namespace | 325 } // namespace |
OLD | NEW |