Advertisement
Guest User

std::copy and memcpy benchmark

a guest
Mar 11th, 2017
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.19 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <Windows.h>
  4. #include <time.h>
  5.  
  6.  
  7. using namespace std;
  8.  
  9. ULONGLONG Ticks64 = NULL;
  10.  
  11.  
  12. void StartCounter( )
  13. {
  14.     Ticks64 = GetTickCount64( );
  15. }
  16.  
  17.  
  18. ULONGLONG GetCounter( )
  19. {
  20.     return GetTickCount64( ) - Ticks64;
  21. }
  22.  
  23. const int sizeofbigdata = 209715200;
  24.  
  25.  
  26. unsigned char * bigdata;
  27. unsigned char * bigdata2;
  28.  
  29.  
  30. void check1( )
  31. {
  32.     memcpy( bigdata, bigdata2, sizeofbigdata );
  33. }
  34.  
  35. void check2( )
  36. {
  37.     copy( bigdata2, bigdata2 + sizeofbigdata, bigdata );
  38. }
  39.  
  40. unsigned char __cdecl randbyte( )
  41. {
  42.     return rand( ) % 0xFF;
  43. }
  44.  
  45. void FillMemoryRandomData( )
  46. {
  47.     unsigned char tmpBuffer[ 4096 ];
  48.     unsigned char tmpBuffer2[ 4096 ];
  49.  
  50.     std::generate( tmpBuffer, tmpBuffer + 4096, randbyte );
  51.     std::generate( tmpBuffer2, tmpBuffer2 + 4096, randbyte );
  52.  
  53.     unsigned char * tmpbigdata = bigdata;
  54.  
  55.     while ( tmpbigdata < bigdata + sizeofbigdata )
  56.     {
  57.         memcpy( tmpbigdata, tmpBuffer, 4096 );
  58.         tmpbigdata += 4096;
  59.     }
  60.  
  61.     tmpbigdata = bigdata2;
  62.  
  63.     while ( tmpbigdata < bigdata2 + sizeofbigdata )
  64.     {
  65.         memcpy( tmpbigdata, tmpBuffer2, 4096 );
  66.         tmpbigdata += 4096;
  67.     }
  68.  
  69. }
  70.  
  71.  
  72. int main( )
  73. {
  74.     srand( time( nullptr ) );
  75.     std::cout << "Init two arrays.\n";
  76.     bigdata = ( unsigned char * )VirtualAlloc( NULL, sizeofbigdata, MEM_COMMIT, PAGE_READWRITE );
  77.     bigdata2 = ( unsigned char * )VirtualAlloc( NULL, sizeofbigdata, MEM_COMMIT, PAGE_READWRITE );
  78.     std::cout << "Use VirtualLock.\n";
  79.  
  80.     VirtualLock( bigdata, sizeofbigdata );
  81.     VirtualLock( bigdata2, sizeofbigdata );
  82.  
  83.     std::cout << "Ok. Fill memory with random data.\n";
  84.     FillMemoryRandomData( );
  85.     std::cout << "Ok. Start memcpy test.\n";
  86.     StartCounter( );
  87.     for ( int i = 100; i--; )
  88.         check1( );
  89.     std::cout << ( GetCounter( ) / 1000 ) << " sec" << std::endl;
  90.  
  91.     std::cout << "Ok. Fill memory with random data.\n";
  92.     FillMemoryRandomData( );
  93.     std::cout << "Ok. Start std::copy test.\n";
  94.  
  95.     StartCounter( );
  96.     for ( int i = 100; i--; )
  97.         check2( );
  98.     std::cout << ( GetCounter( ) / 1000 ) << " sec" << std::endl;
  99.  
  100.     std::cout << "End.\n";
  101.  
  102.     system( "pause" );
  103.    
  104.     return 0;
  105. }
  106.  
  107.  
  108. /*
  109.     Result in Visual Studio 2017 with optimizes enabled. (Max performance)
  110.  
  111.     memcpy 15 sec
  112.     std::copy 8 sec
  113.    
  114. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement