| 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 |