diff options
Diffstat (limited to 'seqreader.c')
-rw-r--r-- | seqreader.c | 49 |
1 files changed, 44 insertions, 5 deletions
diff --git a/seqreader.c b/seqreader.c index c589684..1a13cf9 100644 --- a/seqreader.c +++ b/seqreader.c @@ -1,3 +1,5 @@ +#define _GNU_SOURCE + #include <stdio.h> #include <stdlib.h> #include <sys/types.h> @@ -5,8 +7,14 @@ #include <sys/time.h> #include <unistd.h> #include <dirent.h> +#include <fcntl.h> +#include <string.h> +#include <errno.h> + +#define BUFSIZE 1048576//65536 +#define BLOCK_SIZE 16384//16384 +#define WRITE_INTERVAL 1 -#define BUFSIZE 65536 int main(int argc, char *argv[]) { int err; @@ -17,28 +25,59 @@ int main(int argc, char *argv[]) { size_t us; size_t files = 0; size_t total_size = 0; + size_t last_write = 0; size_t skip; size_t run; - char buffer[65536]; + char buffer[BUFSIZE]; if (argc < 2) { - printf("Usage: %s <directory> [skip]\n", argv[0]); + printf("Usage: %s <directory|device> [skip]\n", argv[0]); exit(0); } + if (!strstr(argv[0], "/dev/")) { + int fd = open(argv[1], O_RDONLY|O_NOATIME|O_LARGEFILE/*|O_DIRECT*/, 0); + if (fd < 0) { + printf("Unable to open device %s\n", argv[1]); + exit(1); + } + + int size = BLOCK_SIZE; + + gettimeofday(&start, NULL); + + err = read(fd, buffer, size); + while (err > 0) { + total_size += err; + + gettimeofday(&tv, NULL); + us = (tv.tv_sec - start.tv_sec) * 1000000 + (tv.tv_usec - start.tv_usec); + if ((us - last_write) > WRITE_INTERVAL * 1000000) { + last_write = us; + printf("Reading: %s (%lu GB), Measured speed: %lu mB/s\n", argv[0], total_size / 1024 / 1024 / 1024, total_size / us); + } + err = read(fd, buffer, size); + } + + close(fd); + + + return 0; + } + chdir(argv[1]); if (argc > 2) { SKIP = atoi(argv[2]); - printf("Skip %i\n", SKIP); + printf("Skip %zu\n", SKIP); } gettimeofday(&start, NULL); for (run = 0; run < SKIP; run++) { skip = 0; dir = opendir("."); - while (ent = readdir(dir)) { + while ((ent = readdir(dir))) { struct stat st; if (((skip++)%SKIP) != run) continue; |