Advertisement
Guest User

Untitled

a guest
Aug 20th, 2019
479
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.70 KB | None | 0 0
  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <sys/mman.h>
  5. #include <fcntl.h>
  6. #include <sys/time.h>
  7. #include <unistd.h>
  8. #include <errno.h>
  9.  
  10. /*
  11. old time:
  12. $ ./test
  13. 1000 mmaps 4 kB blocks: 16638 ms
  14. 1000 mmaps 64 kB blocks: 16557 ms
  15. 1000 mmaps 1024 kB blocks: 18319 ms
  16.  
  17. new time:
  18. $ ./test
  19. 1000 mmaps 4 kB blocks: 177 ms
  20. 1000 mmaps 64 kB blocks: 410 ms
  21. 1000 mmaps 1024 kB blocks: 2146 ms
  22.  
  23. */
  24.  
  25. #define BUFSZ 1000000000  // 10GB
  26.  
  27. void* mapping;
  28. size_t mapping_size;
  29.  
  30. static int open_cheat_mapping(int fd) {
  31.     off_t current = lseek(fd, 0, SEEK_CUR);
  32.     mapping_size = lseek(fd, 0, SEEK_END);
  33.     lseek(fd, current, SEEK_SET);
  34.    
  35.     mapping = mmap(NULL, mapping_size, PROT_READ, MAP_PRIVATE, fd, 0);
  36.     if (mapping == MAP_FAILED) {
  37.         mapping = NULL;
  38.         return errno;
  39.     }
  40.     return 0;
  41. }
  42.  
  43. static void* mmap_cheat(void* addr, size_t len, int prot, int flags, int fd, off_t offset) {
  44.     if (mapping == NULL && open_cheat_mapping(fd) != 0) {
  45.         return MAP_FAILED;
  46.     }
  47.     size_t end_size;
  48.     if (__builtin_add_overflow(offset, len, &end_size) || end_size > mapping_size) {
  49.         return MAP_FAILED;
  50.     }
  51.     return mapping + offset;
  52. }
  53.  
  54. static int munmap_cheat(void* addr, size_t len) {
  55.     return 0;
  56. }
  57.  
  58. #ifdef CHEAT
  59. #define mmap mmap_cheat
  60. #define munmap munmap_cheat
  61. #endif
  62.  
  63. int main(int argc, char *argv[])
  64. {
  65.         unsigned int total, msize, offset, secs;
  66.         int fd, i, j, rslt;
  67.         void * p;
  68.         volatile char c;
  69.         struct timeval start, end;
  70.  
  71. // Time 1000 mmaps and munmaps from random offsets for various
  72. // sizes of mapped chunk.
  73.         for (msize = 4096; msize <= 1048576; msize *= 16) {
  74.                 gettimeofday(&start, NULL);
  75.                 fd = open("io_benchmark.dat", O_RDONLY); // file
  76.                 if (fd  < 0 ) abort();
  77.                 for (i = 0; i < 1000; i++) {
  78.                 // Make sure the block to be mapped doesn't start in the
  79.                 // last meg and is multiply of 4096.
  80.                 offset = (off_t) random() % (BUFSZ - 1048576) /10000 * 4096;
  81.                 p = mmap(0, (size_t) msize, PROT_READ, MAP_PRIVATE, fd, offset);
  82.                 if (p == MAP_FAILED){
  83.                         printf("map failed: %s offset: %i \n", strerror(errno), offset);
  84.                 }
  85.                 for (j = 1; j < msize; j++) {
  86.                         c = *((char *)p+j);
  87.                         }
  88.                 munmap(p, (size_t) msize);
  89.                 }
  90.         gettimeofday(&end, NULL);
  91.         secs = ((end.tv_sec * 1000) + (end.tv_usec /1000)) - ((start.tv_sec * 1000) + (start.tv_usec /1000)) ;
  92.         printf("1000 mmaps %d kB blocks: %i ms\n", msize/1024, secs);
  93.   rslt = close(fd);
  94.   if (fd  < 0 ) abort();
  95.   }
  96.     return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement