#include #include #include #include #include #include char *file = "/dev/ad0"; int fd; off_t size = (off_t) 19*G; #define NOW (rdtsc()/550) #define F_PURGE 42 int main(int argc, char *argv[]) { off_t pos, leap; int iter; char buf[64*K]; long long before, after; fd = open(file, O_RDONLY); unless (fd >= 0) pdie("open"); srandom(time(0)+getpid()); for (leap = 512; leap < 20*((off_t) G); leap = (off_t)(leap * 1.1)) { long long tot = 0; /* fcntl(fd, F_PURGE); */ for (iter = 0; iter < 50; iter++) { pos = (random() % ((size - leap) >> Mshift)) << Mshift; pos |= (random() % M); if (lseek(fd, pos, SEEK_SET) < 0) pdie("lseek"); if (read(fd, buf, 512) < 0) pdie("read"); pos += leap; if (lseek(fd, pos, SEEK_SET) < 0) pdie("lseek"); before = NOW; if (read(fd, buf, 512) < 0) pdie("read"); after = NOW; /* printf("%lld\t%g\n", leap/512, (after-before)/1000.0); */ tot += after - before; } printf("%lld\t%g\n", leap/512, (tot/1000.0)/iter); fflush(stdout); } return 0; }