perf_list.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 548 行 · 第 1/2 页

CPP
548
字号
   //First create the elements   std::vector<typename ilist::value_type> objects(NumElements);   for(int i = 0; i < NumElements; ++i)      objects[i].i_ = i;   //Now create the intrusive list and insert data   ilist l(objects.begin(), objects.end());   //Now measure sorting time   ptime tini = microsec_clock::universal_time();   for(int i = 0; i < NumIter; ++i){      if(!(i % 2)){         l.sort(std::greater<typename ilist::value_type>());      }      else{         l.sort(std::less<typename ilist::value_type>());      }   }   ptime tend = microsec_clock::universal_time();   std::cout << "link_mode: " << LinkMode << ", usecs/iteration: "             << (tend-tini).total_microseconds()/NumIter << std::endl;}template <bool BigSize>void test_std_list_sort(){   typedef typename get_list<BigSize>::type stdlist;   //Create the list and insert values   stdlist l;   for(int i = 0; i < NumElements; ++i)      l.push_back(typename stdlist::value_type(i));   //Now measure sorting time   ptime tini = microsec_clock::universal_time();   for(int i = 0; i < NumIter; ++i){      if(!(i % 2)){         l.sort(std::greater<typename stdlist::value_type>());      }      else{         l.sort(std::less<typename stdlist::value_type>());      }   }   ptime tend = microsec_clock::universal_time();   std::cout << "std::list usecs/iteration: "             << (tend-tini).total_microseconds()/NumIter << std::endl;}template <bool BigSize>void test_compact_std_ptrlist_sort(){   typedef typename get_list<BigSize>::type stdlist;   typedef typename get_ptrlist<BigSize>::type stdptrlist;   //First create the elements   std::vector<typename stdlist::value_type> objects(NumElements);   for(int i = 0; i < NumElements; ++i)      objects[i].i_ = i;   //Now create the std list and insert   stdptrlist l;   for(int i = 0; i < NumElements; ++i)      l.push_back(&objects[i]);   //Now measure sorting time   ptime tini = microsec_clock::universal_time();   for(int i = 0; i < NumIter; ++i){      if(!(i % 2)){         l.sort(func_ptr_adaptor<std::greater<typename stdlist::value_type> >());      }      else{         l.sort(func_ptr_adaptor<std::less<typename stdlist::value_type> >());      }   }   ptime tend = microsec_clock::universal_time();   std::cout << "compact std::list usecs/iteration: "             << (tend-tini).total_microseconds()/NumIter << std::endl;}template <bool BigSize>void test_disperse_std_ptrlist_sort(){   typedef typename get_list<BigSize>::type stdlist;   typedef typename get_ptrlist<BigSize>::type stdptrlist;   //First create the elements and the list   std::list<typename stdlist::value_type> objects;   stdptrlist l;   for(int i = 0; i < NumElements; ++i){      objects.push_back(typename stdlist::value_type(i));      l.push_back(&objects.back());   }   //Now measure sorting time   ptime tini = microsec_clock::universal_time();   for(int i = 0; i < NumIter; ++i){      if(!(i % 2)){         l.sort(func_ptr_adaptor<std::greater<typename stdlist::value_type> >());      }      else{         l.sort(func_ptr_adaptor<std::less<typename stdlist::value_type> >());      }   }   ptime tend = microsec_clock::universal_time();   std::cout << "disperse std::list usecs/iteration: "             << (tend-tini).total_microseconds()/NumIter << std::endl;}//]////////////////////////////////////////////////////////////////////////////                            WRITE ACCESS////////////////////////////////////////////////////////////////////////////[perf_list_write_accesstemplate <bool BigSize, link_mode_type LinkMode>void test_intrusive_list_write_access(){   typedef typename get_ilist<BigSize, LinkMode>::type ilist;   //First create the elements   std::vector<typename ilist::value_type> objects(NumElements);   for(int i = 0; i < NumElements; ++i){      objects[i].i_ = i;   }   //Now create the intrusive list and insert data   ilist l(objects.begin(), objects.end());   //Now measure access time to the value type   ptime tini = microsec_clock::universal_time();   for(int i = 0; i < NumIter; ++i){      typename ilist::iterator it(l.begin()), end(l.end());      for(; it != end; ++it){         ++(it->i_);      }   }   ptime tend = microsec_clock::universal_time();   std::cout << "link_mode: " << LinkMode << ", usecs/iteration: "             << (tend-tini).total_microseconds()/NumIter << std::endl;}template <bool BigSize>void test_std_list_write_access(){   typedef typename get_list<BigSize>::type stdlist;   //Create the list and insert values   stdlist l;   for(int i = 0; i < NumElements; ++i)      l.push_back(typename stdlist::value_type(i));   //Now measure access time to the value type   ptime tini = microsec_clock::universal_time();   for(int i = 0; i < NumIter; ++i){      typename stdlist::iterator it(l.begin()), end(l.end());      for(; it != end; ++it){         ++(it->i_);      }   }   ptime tend = microsec_clock::universal_time();   std::cout << "std::list usecs/iteration: "             << (tend-tini).total_microseconds()/NumIter << std::endl;}template <bool BigSize>void test_compact_std_ptrlist_write_access(){   typedef typename get_list<BigSize>::type stdlist;   typedef typename get_ptrlist<BigSize>::type stdptrlist;   //First create the elements   std::vector<typename stdlist::value_type> objects(NumElements);   for(int i = 0; i < NumElements; ++i){      objects[i].i_ = i;   }   //Now create the std list and insert   stdptrlist l;   for(int i = 0; i < NumElements; ++i)      l.push_back(&objects[i]);   //Now measure access time to the value type   ptime tini = microsec_clock::universal_time();   for(int i = 0; i < NumIter; ++i){      typename stdptrlist::iterator it(l.begin()), end(l.end());      for(; it != end; ++it){         ++((*it)->i_);      }   }   ptime tend = microsec_clock::universal_time();   std::cout << "compact std::list usecs/iteration: "             << (tend-tini).total_microseconds()/NumIter << std::endl;}template <bool BigSize>void test_disperse_std_ptrlist_write_access(){   typedef typename get_list<BigSize>::type stdlist;   typedef typename get_ptrlist<BigSize>::type stdptrlist;   //First create the elements   std::list<typename stdlist::value_type> objects;   //Now create the std list and insert   stdptrlist l;   for(int i = 0; i < NumElements; ++i){      objects.push_back(typename stdlist::value_type(i));      l.push_back(&objects.back());   }   //Now measure access time to the value type   ptime tini = microsec_clock::universal_time();   for(int i = 0; i < NumIter; ++i){      typename stdptrlist::iterator it(l.begin()), end(l.end());      for(; it != end; ++it){         ++((*it)->i_);      }   }   ptime tend = microsec_clock::universal_time();   std::cout << "disperse std::list usecs/iteration: "             << (tend-tini).total_microseconds()/NumIter << std::endl;}//]////////////////////////////////////////////////////////////////////////////                            ALL TESTS//////////////////////////////////////////////////////////////////////////template<bool BigSize>void do_all_tests(){   std::cout << "\n\nTesting push back() with BigSize:" << BigSize << std::endl;   test_intrusive_list_push_back<BigSize, normal_link>();   test_intrusive_list_push_back<BigSize, safe_link>();   test_intrusive_list_push_back<BigSize, auto_unlink>();   test_std_list_push_back<BigSize> ();   test_compact_std_ptrlist_push_back<BigSize>();   test_disperse_std_ptrlist_push_back<BigSize>();   //reverse   std::cout << "\n\nTesting reverse() with BigSize:" << BigSize << std::endl;   test_intrusive_list_reverse<BigSize, normal_link>();   test_intrusive_list_reverse<BigSize, safe_link>();   test_intrusive_list_reverse<BigSize, auto_unlink>();   test_std_list_reverse<BigSize>();   test_compact_std_ptrlist_reverse<BigSize>();   test_disperse_std_ptrlist_reverse<BigSize>();   //sort   std::cout << "\n\nTesting sort() with BigSize:" << BigSize << std::endl;   test_intrusive_list_sort<BigSize, normal_link>();   test_intrusive_list_sort<BigSize, safe_link>();   test_intrusive_list_sort<BigSize, auto_unlink>();   test_std_list_sort<BigSize>();   test_compact_std_ptrlist_sort<BigSize>();   test_disperse_std_ptrlist_sort<BigSize>();   //write_access   std::cout << "\n\nTesting write_access() with BigSize:" << BigSize << std::endl;   test_intrusive_list_write_access<BigSize, normal_link>();   test_intrusive_list_write_access<BigSize, safe_link>();   test_intrusive_list_write_access<BigSize, auto_unlink>();   test_std_list_write_access<BigSize>();   test_compact_std_ptrlist_write_access<BigSize>();   test_disperse_std_ptrlist_write_access<BigSize>();}int main(){   //First pass the tests with a small size class   do_all_tests<false>();   //Now pass the tests with a big size class   do_all_tests<true>();   return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?