@@ -100,6 +100,42 @@ int main(int argc, char** argv) {
100
100
bm.operator ()<std::list<int >>(" rng::equal(list<int>) (it, it, it, it, pred)" , ranges_equal_4leg_pred);
101
101
}
102
102
103
+ // Benchmark {std,ranges}::equal on vector<bool>.
104
+ {
105
+ auto bm = [](std::string name, auto equal, bool aligned) {
106
+ benchmark::RegisterBenchmark (
107
+ name,
108
+ [=](auto & st) {
109
+ std::size_t const size = st.range ();
110
+ std::vector<bool > c1 (size, true );
111
+ std::vector<bool > c2 (size + 8 , true );
112
+ auto first1 = c1.begin ();
113
+ auto last1 = c1.end ();
114
+ auto first2 = aligned ? c2.begin () : c2.begin () + 4 ;
115
+ auto last2 = aligned ? c2.end () : c2.end () - 4 ;
116
+ for (auto _ : st) {
117
+ benchmark::DoNotOptimize (c1);
118
+ benchmark::DoNotOptimize (c2);
119
+ auto result = equal (first1, last1, first2, last2);
120
+ benchmark::DoNotOptimize (result);
121
+ }
122
+ })
123
+ ->Arg (8 )
124
+ ->Arg (50 ) // non power-of-two
125
+ ->Arg (1024 )
126
+ ->Arg (8192 )
127
+ ->Arg (1 << 20 );
128
+ };
129
+
130
+ // {std,ranges}::equal(vector<bool>) (aligned)
131
+ bm (" std::equal(vector<bool>) (aligned)" , std_equal_4leg, true );
132
+ bm (" rng::equal(vector<bool>) (aligned)" , std::ranges::equal, true );
133
+
134
+ // {std,ranges}::equal(vector<bool>) (unaligned)
135
+ bm (" std::equal(vector<bool>) (unaligned)" , std_equal_4leg, false );
136
+ bm (" rng::equal(vector<bool>) (unaligned)" , std::ranges::equal, false );
137
+ }
138
+
103
139
benchmark::Initialize (&argc, argv);
104
140
benchmark::RunSpecifiedBenchmarks ();
105
141
benchmark::Shutdown ();
0 commit comments