| Index: src/platform/microbenchmark/benchmarks/readwrite.cc
|
| diff --git a/src/platform/microbenchmark/benchmarks/readwrite.cc b/src/platform/microbenchmark/benchmarks/readwrite.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..72614ee1eb7cbe49aee4eb9d840944be3c42fc3a
|
| --- /dev/null
|
| +++ b/src/platform/microbenchmark/benchmarks/readwrite.cc
|
| @@ -0,0 +1,83 @@
|
| +// Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +// Some portions Copyright (c) 2009 The Chromium Authors.
|
| +//
|
| +// Microbenchmark of basic read/write throughput
|
| +#include "microbenchmark/microbenchmark.h"
|
| +
|
| +#include <fcntl.h>
|
| +#include <stdio.h>
|
| +#include <stdlib.h>
|
| +#include <sys/stat.h>
|
| +#include <sys/types.h>
|
| +#include <sys/unistd.h>
|
| +#include <syscall.h>
|
| +#include <time.h>
|
| +
|
| +namespace chromeos {
|
| +namespace benchmarks {
|
| +
|
| +#define IO_SIZE 4096
|
| +#define CALL_SYSCALL(_SCAF, syscallargs...) \
|
| + (_SCAF ? IO_SIZE : syscall(syscallargs))
|
| +static long kDefaultAmount = 0x4000;
|
| +static const char *kDevUrandom = "/dev/urandom";
|
| +static const char *kDevNull = "/dev/null";
|
| +
|
| +// Lovely globals used from Setup->Test.
|
| +static int rfd = -1;
|
| +static int wfd = -1;
|
| +static long amount = kDefaultAmount;
|
| +
|
| +static void ReadWriteSetup(uint64 runs) {
|
| + CommandLine *cl = CommandLine::ForCurrentProcess();
|
| + std::string amount_str = cl->GetSwitchValueASCII("readwrite-amount");
|
| + std::string source = cl->GetSwitchValueASCII("readwrite-source");
|
| + std::string destination = cl->GetSwitchValueASCII("readwrite-destination");
|
| +
|
| + if (amount_str.empty()) {
|
| + LOG(INFO) << "--readwrite-amount is missing.";
|
| + LOG(INFO) << "Defaulting to " << amount << " bytes";
|
| + } else {
|
| + amount = strtol(amount_str.c_str(), NULL, 0);
|
| + if (amount < 0 || amount > 0xffffff) {
|
| + LOG(ERROR) << "Amount specified was too large: " << amount;
|
| + LOG(INFO) << "Using default amount of " << kDefaultAmount;
|
| + }
|
| + amount = kDefaultAmount;
|
| + }
|
| + if (source.empty()) {
|
| + LOG(INFO) << "--readwrite-source missing.";
|
| + LOG(INFO) << "Defaulting to /dev/urandom as a source";
|
| + source = kDevUrandom;
|
| + }
|
| + if (destination.empty()) {
|
| + LOG(INFO) << "--readwrite-destination missing.";
|
| + LOG(INFO) << "Defaulting to /dev/null as a destination";
|
| + destination = kDevNull;
|
| + }
|
| + wfd = open("/dev/null", O_WRONLY);
|
| + rfd = open("/dev/zero", O_RDONLY);
|
| + LOG_IF(FATAL, wfd < 0 || rfd < 0) << "Failed to open /dev/null or /dev/zero";
|
| +}
|
| +
|
| +static void ReadWrite(bool scaffold_only) {
|
| + ssize_t so_far = 0;
|
| + ssize_t bytes = 0;
|
| + char buf[IO_SIZE];
|
| + while (so_far < amount) {
|
| + bytes = CALL_SYSCALL(scaffold_only, __NR_read, rfd, buf, sizeof(buf));
|
| + PLOG_IF(FATAL, bytes < 0) << "An unexpected error occurred during read.";
|
| + so_far += bytes;
|
| + PLOG_IF(FATAL,
|
| + CALL_SYSCALL(scaffold_only, __NR_write, wfd, buf, bytes) != bytes)
|
| + << "An unexpected error occurred during write.";
|
| + }
|
| +}
|
| +CHROMEOS_MICROBENCHMARK_WITH_SETUP(ReadWriteSetup, ReadWrite, 1000);
|
| +#undef IO_SIZE
|
| +#undef CALL_SYSCALL
|
| +
|
| +} // namespace benchmarks
|
| +} // namespace chromeos
|
|
|