• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // -----------------------------------------------------------
2 //
3 //           Copyright (c) 2003-2004 Gennaro Prota
4 //
5 // Distributed under the Boost Software License, Version 1.0.
6 //    (See accompanying file LICENSE_1_0.txt or copy at
7 //          http://www.boost.org/LICENSE_1_0.txt)
8 //
9 // -----------------------------------------------------------
10 
11 //  boost::dynamic_bitset timing tests
12 //
13 //  NOTE:
14 //  ~~~~~
15 //   This is a preliminary, incomplete version.
16 //
17 //   If you are interested in having more benchmarks please make a
18 //   request on the boost list, which could encourage me to continue
19 //   this work.
20 
21 //   Also, if you use boost::dynamic_bitset on a platform where
22 //   CHAR_BIT >= 9 I suggest experimenting with the size of the count
23 //   table in detail/dynamic_bitset.hpp and report any interesting
24 //   discovery on the list as well.
25 
26 //   You might also want to try both counting methods (by_bytes vs.
27 //   by_blocks) to see if the one that is selected automatically is
28 //   actually the fastest on your system.
29 
30 //
31 //
32 // -----------------------------------------------------------------------//
33 
34 
35 #include "boost/config.hpp"
36 
37 #if  defined (__STL_CONFIG_H) && !defined (__STL_USE_NEW_IOSTREAMS)
38   // for pre 3.0 versions of libstdc++
39 # define BOOST_OLD_IOSTREAMS
40 #endif
41 // ------------------------------------------------- //
42 
43 #include <typeinfo>
44 #include <iostream>
45 #if !defined(BOOST_OLD_IOSTREAMS)
46 # include <ostream>
47 #endif
48 
49 
50 #include "boost/cstdlib.hpp"
51 #include "boost/version.hpp"
52 #include "boost/timer/timer.hpp"
53 #include "boost/dynamic_bitset.hpp"
54 
55 
56 namespace {
57 
58     // the m_ prefixes, below, are mainly to avoid problems with g++:
59     // see http://gcc.gnu.org/ml/gcc-bugs/1999-03n/msg00884.html
60     //
61     class boost_version {
62         int m_major;
63         int m_minor;
64         int m_subminor;
65 
66     public:
boost_version(unsigned long v=BOOST_VERSION)67         boost_version(unsigned long v = BOOST_VERSION):
68           m_major(v / 100000), m_minor(v / 100 % 1000), m_subminor(v % 100) {}
69 
70         friend std::ostream & operator<<(std::ostream &, const boost_version &);
71     };
72 
73 
74     // give up using basic_ostream, to avoid headaches with old libraries
operator <<(std::ostream & os,const boost_version & v)75      std::ostream& operator<<(std::ostream& os, const boost_version & v) {
76         return os << v.m_major << '.' << v.m_minor << '.' << v.m_subminor;
77      }
78 
79 }
80 
81 
prologue()82 void prologue()
83 {
84     std::cout << '\n';
85     std::cout << "Compiler: " << BOOST_COMPILER << '\n';
86     std::cout << "Std lib : " << BOOST_STDLIB << '\n';
87     std::cout << "Boost v.: " << boost_version() << '\n';
88 
89     std::cout << '\n';
90 }
91 
92 
93 
94 template <typename T>
timing_test(T * =0)95 void timing_test(T* = 0) // dummy parameter to workaround VC6
96 {
97 #ifndef BOOST_NO_STRESS_TEST
98     const unsigned long num = 30 * 100000;
99 #else
100     const unsigned long num = 30 * 1000;
101 #endif
102 
103 
104     // This variable is printed at the end of the test,
105     // to prevent the optimizer from removing the call to
106     // count() in the loop below.
107     typename boost::dynamic_bitset<T>::size_type dummy = 0;
108 
109     std::cout << "\nTimings for dynamic_bitset<" << typeid(T).name()
110               << ">  [" << num << " iterations]\n";
111     std::cout << "--------------------------------------------------\n";
112 
113     {
114         boost::timer::auto_cpu_timer time;
115 
116         const typename boost::dynamic_bitset<T>::size_type sz = 5000;
117         for (unsigned long i = 0; i < num; ++i) {
118             boost::dynamic_bitset<T> bs(sz, i);
119             dummy += bs.count();
120         }
121     }
122 
123     std::cout << "(total count: " << dummy << ")\n\n";
124 }
125 
126 
127 
main()128 int main()
129 {
130     prologue();
131 
132     timing_test<unsigned char>();
133     timing_test<unsigned short>();
134     timing_test<unsigned int>();
135     timing_test<unsigned long>();
136 # ifdef BOOST_HAS_LONG_LONG
137     timing_test< ::boost::ulong_long_type>();
138 # endif
139 
140     return boost::exit_success;
141 }
142 
143