fork download
  1. #include <stdint.h>
  2.  
  3. template<int BytesCount>
  4. struct rawdata
  5. {
  6. char _[ BytesCount ];
  7. inline char& operator[](int index)
  8. {
  9. return _[ index ];
  10. }
  11. };
  12.  
  13. //...
  14.  
  15. rawdata<8> genSWAP32(rawdata<8> p)
  16. {
  17. rawdata<8> res = p;
  18. uint32_t* a = (uint32_t*)&res[0];
  19. uint32_t* b = (uint32_t*)&res[4];
  20. uint32_t tmp = *a;
  21. *a = *b;
  22. *b = tmp;
  23. return res;
  24. }
  25.  
  26. rawdata<8> genSWAP(rawdata<8> p)
  27. {
  28. return { p[ 4 ], p[ 5 ], p[ 6 ], p[ 7 ], p[ 0 ], p[ 1 ], p[ 2 ], p[ 3 ] };
  29. }
  30.  
  31.  
  32. #include <iostream>
  33. #include <chrono>
  34.  
  35. template<int n>
  36. std::ostream& operator<<(std::ostream& os, rawdata<n> p)
  37. {
  38. for(int i = 0; i < n; i++)
  39. os << " - " << (int)p[i];
  40. return os;
  41. }
  42.  
  43. int main()
  44. {
  45. // Check that functions outputs the same things
  46. rawdata<8> test = { 10, 20, 30, 40, 50, 60, 70, 80 };
  47. rawdata<8> t1 = genSWAP(test);
  48. rawdata<8> t2 = genSWAP32(test);
  49. std::cout << "test" << test << "\n";
  50. std::cout << "t1 " << t1 << "\n";
  51. std::cout << "t2 " << t2 << "\n";
  52.  
  53. // Perf check
  54. const uint64_t N = 10000000;
  55. rawdata<8> val = test;
  56. std::chrono::steady_clock::time_point start, end;
  57. uint64_t timeSWAP = 0, timeSWAP32 = 0;
  58.  
  59. start = std::chrono::steady_clock::now();
  60. for(uint64_t t = 0; t < N; t++)
  61. val = genSWAP(val);
  62. end = std::chrono::steady_clock::now();
  63. timeSWAP = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
  64.  
  65. start = std::chrono::steady_clock::now();
  66. for(uint64_t t = 0; t < N; t++)
  67. val = genSWAP32(val);
  68. end = std::chrono::steady_clock::now();
  69. timeSWAP32 = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
  70.  
  71. std::cout << "SWAP : " << timeSWAP << "µs\n";
  72. std::cout << "SWAP32: " << timeSWAP32 << "µs\n";
  73. std::cout << "SWAP32 is " << (timeSWAP / float(timeSWAP32)) << "x faster than SWAP\n";
  74. std::cout << "\n\n(unused" << val << ")\n";
  75. }
  76.  
Success #stdin #stdout 0.06s 3296KB
stdin
Standard input is empty
stdout
test - 10 - 20 - 30 - 40 - 50 - 60 - 70 - 80
t1   - 50 - 60 - 70 - 80 - 10 - 20 - 30 - 40
t2   - 50 - 60 - 70 - 80 - 10 - 20 - 30 - 40
SWAP  : 53065µs
SWAP32: 13633µs
SWAP32 is 3.89239x faster than SWAP


(unused - 10 - 20 - 30 - 40 - 50 - 60 - 70 - 80)