Advertisement
Guest User

mmap_test

a guest
Sep 4th, 2014
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.76 KB | None | 0 0
  1. #include <sys/mman.h>
  2. #include <err.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <time.h>
  8. #include <unistd.h>
  9.  
  10. #define CLEAREOL "\e[0K"
  11. #define CLOCK_START(a) double _clk_##a = now(); printf("%s... \n", #a)
  12. #define CLOCK_STOP(a) printf(" ...%s: %.3fs\n", #a, now() - _clk_##a)
  13.  
  14. static double now() {
  15.   struct timespec ts;
  16.   clock_gettime(CLOCK_MONOTONIC, &ts);
  17.   return ts.tv_sec + ts.tv_nsec * 1E-9;
  18. }
  19.  
  20. int main() {
  21.   setvbuf(stdout, NULL, _IONBF, 0);
  22.  
  23.   int fd = open("backing-file", O_RDWR | O_CREAT | O_TRUNC, 0666);
  24.   if(fd == -1)
  25.     err(1, "open");
  26.  
  27.   size_t len  = 200 * 1024 * 1024;
  28.   size_t blen = 128 * 1024;
  29.  
  30.   CLOCK_START(write);
  31.   char *buf = calloc(1, blen);
  32.   for(size_t i = 0; i < len; i += blen) {
  33.     printf("\rzeroing: %.1f MB" CLEAREOL, i * 1E-6);
  34.     if(write(fd, buf, blen) != blen)
  35.       err(1, "write\n");
  36.   }
  37.   free(buf);
  38.   printf("\n");
  39.   CLOCK_STOP(write);
  40.  
  41.   CLOCK_START(mmap);
  42.   void *p = mmap(NULL, len, PROT_READ | PROT_WRITE,
  43.      MAP_SHARED | MAP_NOSYNC | MAP_ALIGNED_SUPER, fd, 0);
  44.  
  45.   if(p == MAP_FAILED)
  46.     err(1, "mmap");
  47.   CLOCK_STOP(mmap);
  48.    
  49.   if(close(fd) == -1)
  50.     err(1, "close");
  51.  
  52.   double start, stop, last;
  53.   stop = start = now();
  54.   int n = 0;
  55.   do {
  56.     memset(p, 0, len);
  57.     last = stop; stop = now();
  58.    
  59.     double bw = 1E-6 * len / (stop - last);
  60.     printf("\r%.1fs: memset #%d: %.1fMBps" CLEAREOL, stop - start, ++n, bw);
  61.     if(bw < 500.0)
  62.       printf(" - stalled\n");
  63.   } while(stop - start < 100.0);
  64.   printf("\noverall bandwidth: %.1fMBps\n", n * (double)len / (stop - start) * 1E-6);
  65.  
  66.   CLOCK_START(munmap);
  67.   if(munmap(p, len) == -1)
  68.     err(1, "munmap");
  69.   CLOCK_STOP(munmap);
  70.  
  71.   printf("done\n");
  72.   return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement