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 + -
显示快捷键?