perf_list.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 548 行 · 第 1/2 页
CPP
548 行
///////////////////////////////////////////////////////////////////////////////// (C) Copyright Ion Gaztanaga 2007//// Distributed under the Boost Software License, Version 1.0.// (See accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)//// See http://www.boost.org/libs/intrusive for documentation./////////////////////////////////////////////////////////////////////////////////Includes for tests#include <boost/config.hpp>#include <list>#include <functional>#include <iostream>#include <boost/intrusive/list.hpp>#include <boost/date_time/posix_time/posix_time.hpp>using namespace boost::posix_time;//[perf_list_value_type//Iteration and element count definesconst int NumIter = 100;const int NumElements = 50000;using namespace boost::intrusive;template<bool BigSize> struct filler { int dummy[10]; };template <> struct filler<false> {};template<bool BigSize> //The object for non-intrusive containersstruct test_class : private filler<BigSize>{ int i_; test_class() {} test_class(int i) : i_(i) {} friend bool operator <(const test_class &l, const test_class &r) { return l.i_ < r.i_; } friend bool operator >(const test_class &l, const test_class &r) { return l.i_ > r.i_; }};template <bool BigSize, link_mode_type LinkMode>struct itest_class //The object for intrusive containers : public list_base_hook<link_mode<LinkMode> >, public test_class<BigSize>{ itest_class() {} itest_class(int i) : test_class<BigSize>(i) {}};template<class FuncObj> //Adapts functors taking values to functors taking pointersstruct func_ptr_adaptor : public FuncObj{ typedef typename FuncObj::first_argument_type* first_argument_type; typedef typename FuncObj::second_argument_type* second_argument_type; typedef typename FuncObj::result_type result_type; result_type operator()(first_argument_type a, second_argument_type b) const { return FuncObj::operator()(*a, *b); }};//]template <bool BigSize, link_mode_type LinkMode>struct get_ilist //Helps to define an intrusive list from a policy{ typedef list<itest_class<BigSize, LinkMode>, constant_time_size<false> > type;};template <bool BigSize> //Helps to define an std liststruct get_list { typedef std::list<test_class<BigSize> > type; };template <bool BigSize> //Helps to define an std pointer liststruct get_ptrlist { typedef std::list<test_class<BigSize>*> type; };//////////////////////////////////////////////////////////////////////////// PUSH_BACK//////////////////////////////////////////////////////////////////////////template <bool BigSize, link_mode_type LinkMode>void test_intrusive_list_push_back(){ typedef typename get_ilist<BigSize, LinkMode>::type ilist; ptime tini = microsec_clock::universal_time(); for(int i = 0; i < NumIter; ++i){ //First create the elements and insert them in the intrusive list //[perf_list_push_back_intrusive std::vector<typename ilist::value_type> objects(NumElements); ilist l; for(int i = 0; i < NumElements; ++i) l.push_back(objects[i]); //Elements are unlinked in ilist's destructor //Elements are destroyed in vector's destructor //] } 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_push_back(){ typedef typename get_list<BigSize>::type stdlist; ptime tini = microsec_clock::universal_time(); for(int i = 0; i < NumIter; ++i){ //Now create the std list and insert //[perf_list_push_back_stdlist stdlist l; for(int i = 0; i < NumElements; ++i) l.push_back(typename stdlist::value_type(i)); //Elements unlinked and destroyed in stdlist's destructor //] } 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_push_back(){ typedef typename get_list<BigSize>::type stdlist; typedef typename get_ptrlist<BigSize>::type stdptrlist; //Now measure insertion time, including element creation ptime tini = microsec_clock::universal_time(); for(int i = 0; i < NumIter; ++i){ //Create elements and insert their pointer in the list //[perf_list_push_back_stdptrlist std::vector<typename stdlist::value_type> objects(NumElements); stdptrlist l; for(int i = 0; i < NumElements; ++i) l.push_back(&objects[i]); //Pointers to elements unlinked and destroyed in stdptrlist's destructor //Elements destroyed in vector's destructor //] } 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_push_back(){ typedef typename get_list<BigSize>::type stdlist; typedef typename get_ptrlist<BigSize>::type stdptrlist; //Now measure insertion time, including element creation ptime tini = microsec_clock::universal_time(); for(int i = 0; i < NumIter; ++i){ //Create elements and insert their pointer in the list //[perf_list_push_back_disperse_stdptrlist stdlist objects; stdptrlist l; for(int i = 0; i < NumElements; ++i){ objects.push_back(typename stdlist::value_type(i)); l.push_back(&objects.back()); } //Pointers to elements unlinked and destroyed in stdptrlist's destructor //Elements unlinked and destroyed in stdlist's destructor //] } ptime tend = microsec_clock::universal_time(); std::cout << "disperse std::list usecs/iteration: " << (tend-tini).total_microseconds()/NumIter << std::endl;}//////////////////////////////////////////////////////////////////////////// REVERSE////////////////////////////////////////////////////////////////////////////[perf_list_reversetemplate <bool BigSize, link_mode_type LinkMode>void test_intrusive_list_reverse(){ typedef typename get_ilist<BigSize, LinkMode>::type ilist; //First create the elements std::vector<typename ilist::value_type> objects(NumElements); //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){ l.reverse(); } 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_reverse(){ 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()); //Now measure sorting time ptime tini = microsec_clock::universal_time(); for(int i = 0; i < NumIter; ++i){ l.reverse(); } 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_reverse(){ 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); //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){ l.reverse(); } 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_reverse(){ 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()); l.push_back(&objects.back()); } //Now measure sorting time ptime tini = microsec_clock::universal_time(); for(int i = 0; i < NumIter; ++i){ l.reverse(); } ptime tend = microsec_clock::universal_time(); std::cout << "disperse std::list usecs/iteration: " << (tend-tini).total_microseconds()/NumIter << std::endl;}//]//////////////////////////////////////////////////////////////////////////// SORT////////////////////////////////////////////////////////////////////////////[perf_list_sorttemplate <bool BigSize, link_mode_type LinkMode>void test_intrusive_list_sort(){ typedef typename get_ilist<BigSize, LinkMode>::type ilist;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?