From d61fa7974f87b24b557e8440a6e6fab70fc8dee0 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 20 Jan 2015 00:54:48 +0100 Subject: rename readtest (.c not .cc) --- tools/readtest.c | 148 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 tools/readtest.c (limited to 'tools/readtest.c') diff --git a/tools/readtest.c b/tools/readtest.c new file mode 100644 index 0000000000..53f559c4d3 --- /dev/null +++ b/tools/readtest.c @@ -0,0 +1,148 @@ +/* gcc -o readtest readtest.cc `pkg-config --cflags --libs glib-2.0` */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +char* data = 0; + +int +read_one (int fd, ssize_t sz) +{ + + return 0; +} + +void +usage () +{ + fprintf (stderr, "readtest [ -b BLOCKSIZE ] [ -s ] [ -D ] filename-template\n"); +} + +int +main (int argc, char* argv[]) +{ + int* files; + char optstring[] = "b:D"; + uint32_t block_size = 64 * 1024 * 4; + bool direct = false; + const struct option longopts[] = { + { "blocksize", 1, 0, 'b' }, + { "direct", 0, 0, 'D' }, + { 0, 0, 0, 0 } + }; + + int option_index = 0; + int c = 0; + char const * name_template = 0; + int flags = O_RDONLY; + int n = 0; + int nfiles = 0; + + while (1) { + if ((c = getopt_long (argc, argv, optstring, longopts, &option_index)) == -1) { + break; + } + + switch (c) { + case 'b': + block_size = atoi (optarg); + break; + case 'D': + direct = true; + break; + default: + usage (); + return 0; + } + } + + if (optind < argc) { + name_template = argv[optind]; + } else { + usage (); + return 1; + } + + while (1) { + char path[PATH_MAX+1]; + + snprintf (path, sizeof (path), name_template, n+1); + + if (access (path, R_OK) != 0) { + break; + } + + ++n; + } + + if (n == 0) { + fprintf (stderr, "No matching files found for %s\n", name_template); + return 1; + } + + printf ("Discovered %d files using %s\n", n, name_template); + + nfiles = n; + files = (int *) malloc (sizeof (int) * nfiles); + + for (n = 0; n < nfiles; ++n) { + + char path[PATH_MAX+1]; + int fd; + + snprintf (path, sizeof (path), name_template, n+1); + + if ((fd = open (path, flags, 0644)) < 0) { + fprintf (stderr, "Could not open file #%d @ %s (%s)\n", n, path, strerror (errno)); + return 1; + } + +#ifdef __APPLE__ + if (direct) { + /* Apple man pages say only that it returns "a value other than -1 on success", + which probably means zero, but you just can't be too careful with + those guys. + */ + if (fcntl (fd, F_NOCACHE, 1) == -1) { + fprintf (stderr, "Cannot set F_NOCACHE on file #%d\n", n); + } + } +#endif + + files[n] = fd; + } + + data = (char*) malloc (sizeof (char) * block_size); + uint64_t read = 0; + + while (true) { + gint64 before; + before = g_get_monotonic_time(); + + for (n = 0; n < nfiles; ++n) { + + if (::read (files[n], (char*) data, block_size) != block_size) { + fprintf (stderr, "read failed on file %d (%s)\n", n, strerror (errno)); + return -1; + } + } + + read += block_size; + gint64 elapsed = g_get_monotonic_time() - before; + double bandwidth = ((nfiles * block_size)/1048576.0) / (elapsed/1000000.0); + + printf ("BW @ %Lu %.3f seconds bandwidth %.4f MB/sec\n", read, elapsed/1000000.0, bandwidth); + } + + return 0; +} + + -- cgit v1.2.3