/* * An experiment with parallel reading and writing of files. * * (c) 2007 Martin Mares */ #include #include #include #include #include #include #include #define COPY #define DIRECT 0 // or O_DIRECT static timestamp_t timer; #define P_INIT do { cnt = 0; cnt_rep = 0; cnt_ms = 1; } while(0) #define P_UPDATE(cc) do { \ cnt += cc; \ if (cnt >= cnt_rep) { cnt_ms += get_timer(&timer); \ printf("%d of %d MB (%.2f MB/sec)\r", (int)(cnt >> 20), (int)(total_size >> 20), (double)cnt / 1048576 * 1000 / cnt_ms); \ fflush(stdout); cnt_rep += 1<<26; } } while(0) #define P_FINAL do { \ cnt_ms += get_timer(&timer); \ msg(L_INFO, "Spent %.3f sec (%.2f MB/sec)", (double)cnt_ms/1000, (double)cnt / 1048576 * 1000 / cnt_ms); \ } while(0) int main(int argc, char **argv) { uint files, bufsize; u64 total_size; if (argc != 4 || cf_parse_int(argv[1], (int*) &files) || cf_parse_int(argv[2], (int*) &bufsize) || cf_parse_u64(argv[3], &total_size)) { fprintf(stderr, "Usage: file-test \n"); return 1; } u64 cnt, cnt_rep; uint cnt_ms; int fd[files]; byte *buf[files], name[files][16]; uint xbufsize = bufsize; // Used for single-file I/O byte *xbuf = big_alloc(xbufsize); init_timer(&timer); #ifdef COPY msg(L_INFO, "Creating input file"); int in_fd = ucw_open("tmp/ft-in", O_RDWR | O_CREAT | O_TRUNC | DIRECT, 0666); ASSERT(in_fd >= 0); ASSERT(!(total_size % xbufsize)); P_INIT; for (uint i=0; i> 20), files, bufsize); P_INIT; for (uint r=0; r