[cfe-dev] [libc++] std::count with bool types
Michael Sommerville
msommerville at gmail.com
Thu May 10 08:38:40 PDT 2012
On Thu, May 10, 2012 at 4:02 PM, Howard Hinnant <hhinnant at apple.com> wrote:
> On May 10, 2012, at 10:11 AM, Howard Hinnant wrote:
>
>> And it is still wrong. Sorry. Working on it...
>
> Ok, fix committed revision 156546.
>
> Sorry about the thrash. As an attempt to save what little face I have left, I've expanded your example and put some timers on it. On OS X, compiling with -O3 and in 64 bit mode:
>
> #include <iostream>
> #include <algorithm>
> #include <chrono>
> #include <random>
> #include <vector>
>
> int main ()
> {
> typedef std::chrono::high_resolution_clock Clock;
> typedef std::chrono::nanoseconds ns;
> std::mt19937_64 eng;
> std::uniform_int_distribution<bool> d;
> const unsigned N = 10000;
> // counting boolean elements in array
> bool bool_array[N];
> for (auto& b : bool_array)
> b = d(eng);
> auto t0 = Clock::now();
> int mycount = (int) std::count (bool_array, bool_array+N, true);
> auto t1 = Clock::now();
> std::cout << "true appears " << mycount << " times.\n";
> std::cout << "count took " << ns(t1-t0).count() << "ns\n";
> t0 = Clock::now();
> mycount = (int) std::count (bool_array, bool_array+N, false);
> t1 = Clock::now();
> std::cout << "false appears " << mycount << " times.\n";
> std::cout << "count took " << ns(t1-t0).count() << "ns\n";
>
> // counting boolean elements in container
> std::vector<bool> bool_vector( bool_array,bool_array+N );
> t0 = Clock::now();
> mycount = (int) std::count (bool_vector.begin(), bool_vector.end(), true);
> t1 = Clock::now();
> std::cout << "true appears " << mycount << " times.\n";
> std::cout << "count took " << ns(t1-t0).count() << "ns\n";
> t0 = Clock::now();
> mycount = (int) std::count (bool_vector.begin(), bool_vector.end(), false);
> t1 = Clock::now();
> std::cout << "false appears " << mycount << " times.\n";
> std::cout << "count took " << ns(t1-t0).count() << "ns\n";
> }
>
> I get:
>
> true appears 5039 times.
> count took 6922ns
> false appears 4961 times.
> count took 10328ns
> true appears 5039 times.
> count took 565ns
> false appears 4961 times.
> count took 537ns
>
> So working with bits instead of bools is both correct and about 15 times faster (if you have enough bools anyway). This is what the private header <__bit_reference> is all about: specializing a few of the std::algorithms for bit iterators, used by both bitset and vector<bool>.
>
> Howard
Thank you very much for the quick fix and the lesson! :-)
-Michael
More information about the cfe-dev
mailing list