Guest User

Untitled

a guest
Apr 30th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.97 KB | None | 0 0
  1. #include <windows.h>
  2. #include <cstdlib>
  3. #include <random>
  4. #include <iostream>
  5.  
  6. using namespace std;
  7.  
  8. size_t const BLOCK_SIZE = 4096;
  9. size_t const NUM_BLOCKS = ((size_t)1024 * 1024 * 1024 / BLOCK_SIZE);
  10. size_t const FILE_SIZE  = NUM_BLOCKS * BLOCK_SIZE;
  11.  
  12. int main()
  13. {
  14.     unsigned const PARALLEL_DEGREE = 500;
  15.     HANDLE         hFile;
  16.     OVERLAPPED     aol[PARALLEL_DEGREE];
  17.     BYTE           abBlock[BLOCK_SIZE];
  18.     HANDLE         hIoCompletionPort;
  19.  
  20.     if( (hFile = CreateFile( TEXT("testfile"), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED, NULL )) == INVALID_HANDLE_VALUE )
  21.         return EXIT_FAILURE;
  22.  
  23.     aol[0].Offset = FILE_SIZE - BLOCK_SIZE;
  24.     aol[0].OffsetHigh = 0;
  25.     if( (aol[0].hEvent = CreateEvent( NULL, FALSE, FALSE, NULL )) == NULL ||
  26.         !WriteFile( hFile, abBlock, FILE_SIZE - BLOCK_SIZE, NULL, &aol[0] ) && GetLastError() != ERROR_IO_PENDING )
  27.         return EXIT_FAILURE;
  28.  
  29.     if( (hIoCompletionPort = CreateIoCompletionPort( hFile, NULL, NULL, 1 )) == NULL )
  30.         return EXIT_FAILURE;
  31.  
  32.     random_device                   rd;
  33.     mt19937                         mt( rd() );
  34.     uniform_int_distribution<DWORD> uid( 0, FILE_SIZE - BLOCK_SIZE );
  35.  
  36.     for( unsigned par = 0; par < PARALLEL_DEGREE; par++ )
  37.     {
  38.         aol[par].Offset     = uid( mt ) & (DWORD)-(LONG)BLOCK_SIZE;
  39.         aol[par].OffsetHigh = 0;
  40.         aol[par].hEvent     = NULL;
  41.         if( !ReadFile( hFile, abBlock, BLOCK_SIZE, NULL, &aol[par] ) && GetLastError() != ERROR_IO_PENDING )
  42.             return EXIT_FAILURE;
  43.     }
  44.  
  45.     for( ; ; )
  46.     {
  47.         DWORD       dwBytesTransferred;
  48.         ULONG_PTR   ulpKey;
  49.         OVERLAPPED *pol;
  50.  
  51.         if( !GetQueuedCompletionStatus( hIoCompletionPort, &dwBytesTransferred, &ulpKey, &pol, INFINITE ) )
  52.             return EXIT_FAILURE;
  53.  
  54.         pol->Offset     = uid( mt ) & (DWORD)-(LONG)BLOCK_SIZE;
  55.         pol->OffsetHigh = 0;
  56.         pol->hEvent     = NULL;
  57.         if( !ReadFile( hFile, abBlock, BLOCK_SIZE, NULL, pol ) && GetLastError() != ERROR_IO_PENDING )
  58.             return EXIT_FAILURE;
  59.     }
  60.  
  61.     return EXIT_SUCCESS;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment