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