fast_mem_fn_example.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 123 行
CPP
123 行
// (C) Copyright Tobias Schwinger//// Use modification and distribution are subject to the boost Software License,// Version 1.0. (See http://www.boost.org/LICENSE_1_0.txt).//------------------------------------------------------------------------------// See fast_mem_fn.hpp in this directory for details.#include <vector>#include <cassert>#include <iostream>#include <algorithm>#include <functional>#include <boost/timer.hpp>#include <boost/mem_fn.hpp>#include "fast_mem_fn.hpp"// test class that holds a single integer with getter functionclass test{ int val_id;public: explicit test(int id) : val_id(id) { } int id() const { return val_id; }};// STL style comparator that applies the CriterionExtractor function to both // operands and compares the results with Comparatortemplate<typename CriterionExtractor, typename Comparator>class test_compare{ CriterionExtractor fnc_criterion; Comparator fnc_compare;public: explicit test_compare(CriterionExtractor criterion, Comparator compare) : fnc_criterion(criterion) , fnc_compare(compare) { } template<typename T> inline bool operator()(T const & lhs, T const & rhs) const { return fnc_compare(fnc_criterion(lhs),fnc_criterion(rhs)); }};// helper function to construct an instance of the test_compare comparator.template<typename CriterionExtractor, typename Comparator>test_compare<CriterionExtractor,Comparator> make_test_compare(CriterionExtractor criterion, Comparator compare){ return test_compare<CriterionExtractor,Comparator>(criterion,compare);}// the test case: sort N test objects by id//// the objects are in ascending order before the test run and in descending// order after itstatic const unsigned N = 2000000;typedef std::vector<test> test_vector;void setup_test(test_vector & v){ v.clear(); v.reserve(N); for (unsigned i = 0; i < N; ++i) v.push_back(test(i));}template<typename F> void do_test(test_vector & v, F criterion){ std::sort(v.begin(),v.end(),make_test_compare(criterion,std::greater<int>())); assert(v.begin()->id() == N-1);}// compare performance with boost::mem_fnint main(){ test_vector v; boost::timer t; double time1, time2; std::cout << "Test case: sorting " << N << " objects.\n\n" "Criterion accessor called with | elasped seconds\n" "-------------------------------|----------------" << std::endl; setup_test(v); t.restart();#if !BOOST_WORKAROUND(BOOST_MSVC, < 1400) do_test(v, BOOST_EXAMPLE_FAST_MEM_FN(& test::id));#else // MSVC<8 does not like the implementation of the deduction macro: do_test(v, ::example::fast_mem_fn< int (test::*)() const, & test::id >());#endif time1 = t.elapsed(); std::cout << "fast_mem_fn | " << time1 << std::endl; setup_test(v); t.restart(); do_test(v, boost::mem_fn(& test::id)); time2 = t.elapsed(); std::cout << "mem_fn | " << time2 << std::endl; std::cout << '\n' << (time2/time1-1)*100 << "% speedup" << std::endl; return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?