Advertisement
notinlist

std::vector<bool> performance penalty tester

Apr 22nd, 2024 (edited)
774
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <chrono>
  4. #include <cstdint>
  5.  
  6. template<typename T>
  7. struct Pattern {
  8.     static constexpr T value[] = {1, 1, 1, 0, 1, 0, 0, 0, 1};
  9. };
  10. template<class T> constexpr T Pattern<T>::value[];
  11.  
  12. static size_t const PN = std::size(Pattern<int>::value);
  13. static size_t const REPEAT_COUNT = 50 * 1000 * 1000;
  14.  
  15. static int64_t now()
  16. {
  17.     using namespace std;
  18.     using namespace chrono;
  19.     return duration_cast< milliseconds >(system_clock::now().time_since_epoch()).count();
  20. }
  21.  
  22. template <typename T>
  23. inline void doNotOptimizeAway(T&& datum) {
  24.     asm volatile ("" : "+r" (datum));
  25. }
  26.  
  27. template<typename T>
  28. void test(char const *tName)
  29. {
  30.     using namespace std;
  31.    
  32.     vector<T> vec;
  33.     vec.resize(PN * REPEAT_COUNT);
  34.     vector<T> vec2;
  35.     vec2.resize(PN * REPEAT_COUNT);
  36.    
  37.     int64_t t0 = now();
  38.    
  39.     size_t pos = 0;
  40.     for(size_t i=0; i<REPEAT_COUNT; ++i){
  41.         for(int val: Pattern<T>::value) {
  42.             vec[pos++] = val;
  43.         }
  44.     }
  45.    
  46.     int64_t t1 = now();
  47.    
  48. //  for(T val: vec)
  49. //      doNotOptimizeAway(val);
  50.     size_t n = vec.size();
  51.     for(size_t i=0; i!=n; ++i)
  52.         vec2[i] = vec[i];
  53.    
  54.     int64_t t2 = now();
  55.    
  56.     std::cout << tName << ":"
  57.         " write " << (t1-t0) << " ms;"
  58.         " read+write " << (t2-t1) << " ms."
  59.         " ==> read: " << ((t2-t1)-(t1-t0)) << std::endl;
  60.     return;
  61. }
  62.  
  63. int main()
  64. {
  65.     size_t const TEST_REP = 5;
  66.    
  67.     std::cout << "sizeof(int) == " << sizeof(int) << std::endl;
  68.     for(size_t i=0; i<TEST_REP; ++i)
  69.         test<int>("int");
  70.  
  71.     std::cout << "sizeof(bool) == " << sizeof(bool) << std::endl;
  72.     for(size_t i=0; i<TEST_REP; ++i)
  73.         test<bool>("bool");
  74.  
  75.     std::cout << "sizeof(char) == " << sizeof(char) << std::endl;
  76.     for(size_t i=0; i<TEST_REP; ++i)
  77.         test<char>("char");
  78.  
  79.     std::cout << "sizeof(int_fast8_t) == " << sizeof(int_fast8_t) << std::endl;
  80.     for(size_t i=0; i<TEST_REP; ++i)
  81.         test<int_fast8_t>("int_fast8_t");
  82.  
  83.     std::cout << "sizeof(uint_fast8_t) == " << sizeof(uint_fast8_t) << std::endl;
  84.     for(size_t i=0; i<TEST_REP; ++i)
  85.         test<uint_fast8_t>("uint_fast8_t");
  86.  
  87.     return 0;
  88. }
  89.  
  90. // https://not-in-list.blogspot.com/2024/04/stdvector-perormance-penalty.html
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement