|
@@ -0,0 +1,79 @@
|
|
|
+#include <stdio.h>
|
|
|
+#include <stdlib.h>
|
|
|
+#include <sys/types.h>
|
|
|
+#include <sys/stat.h>
|
|
|
+#include <sys/time.h>
|
|
|
+#include <unistd.h>
|
|
|
+#include <dirent.h>
|
|
|
+
|
|
|
+#define BUFSIZE 65536
|
|
|
+
|
|
|
+int main(int argc, char *argv[]) {
|
|
|
+ int err;
|
|
|
+ size_t SKIP = 1;
|
|
|
+ DIR *dir;
|
|
|
+ struct dirent *ent;
|
|
|
+ struct timeval start, tv;
|
|
|
+ size_t us;
|
|
|
+ size_t files = 0;
|
|
|
+ size_t total_size = 0;
|
|
|
+ size_t skip;
|
|
|
+ size_t run;
|
|
|
+ char buffer[65536];
|
|
|
+
|
|
|
+ if (argc < 2) {
|
|
|
+ printf("Usage: %s <directory> [skip]\n", argv[0]);
|
|
|
+ exit(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ chdir(argv[1]);
|
|
|
+
|
|
|
+ if (argc > 2) {
|
|
|
+ SKIP = atoi(argv[2]);
|
|
|
+
|
|
|
+ printf("Skip %i\n", SKIP);
|
|
|
+ }
|
|
|
+
|
|
|
+ gettimeofday(&start, NULL);
|
|
|
+ for (run = 0; run < SKIP; run++) {
|
|
|
+ skip = 0;
|
|
|
+ dir = opendir(".");
|
|
|
+ while (ent = readdir(dir)) {
|
|
|
+ struct stat st;
|
|
|
+
|
|
|
+ if (((skip++)%SKIP) != run) continue;
|
|
|
+
|
|
|
+ if (stat(ent->d_name, &st)) continue;
|
|
|
+ if (!S_ISREG(st.st_mode)) continue;
|
|
|
+
|
|
|
+ FILE *f = fopen(ent->d_name, "r");
|
|
|
+ if (!f) continue;
|
|
|
+
|
|
|
+ int size = st.st_blksize;
|
|
|
+
|
|
|
+ if (size > BUFSIZE) {
|
|
|
+ printf("Buffer too small\n");
|
|
|
+ exit(1);
|
|
|
+ }
|
|
|
+
|
|
|
+ while (!feof(f)) {
|
|
|
+ err = fread(buffer, 1, size, f);
|
|
|
+ if (err < 0) {
|
|
|
+ printf("Read failed\n");
|
|
|
+ exit(1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ fclose(f);
|
|
|
+
|
|
|
+ total_size += st.st_size;
|
|
|
+ files++;
|
|
|
+
|
|
|
+ gettimeofday(&tv, NULL);
|
|
|
+ us = (tv.tv_sec - start.tv_sec) * 1000000 + (tv.tv_usec - start.tv_usec);
|
|
|
+ printf("Reading: %s (%lu MB), Read: %lu files (%lu GB), Measured speed: %lu mB/s\n", ent->d_name, st.st_size/1024/1024, files, total_size / 1024 / 1024 / 1024, total_size / us);
|
|
|
+ }
|
|
|
+ closedir(dir);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|