@@ -23,8 +23,20 @@ int main(int argc, char** argv) {
23
23
auto std_remove_copy = [](auto first, auto last, auto out, auto const & value) {
24
24
return std::remove_copy (first, last, out, value);
25
25
};
26
+ auto std_remove_copy_if = [](auto first, auto last, auto out, auto const & value) {
27
+ return std::remove_copy_if (first, last, out, [&](auto element) {
28
+ benchmark::DoNotOptimize (element);
29
+ return element == value;
30
+ });
31
+ };
32
+ auto ranges_remove_copy_if = [](auto first, auto last, auto out, auto const & value) {
33
+ return std::ranges::remove_copy_if (first, last, out, [&](auto element) {
34
+ benchmark::DoNotOptimize (element);
35
+ return element == value;
36
+ });
37
+ };
26
38
27
- // Benchmark {std,ranges}::remove_copy on a sequence of the form xxxxxxxxxxyyyyyyyyyy
39
+ // Benchmark {std,ranges}::{ remove_copy,remove_copy_if} on a sequence of the form xxxxxxxxxxyyyyyyyyyy
28
40
// where we remove the prefix of x's from the sequence.
29
41
{
30
42
auto bm = []<class Container >(std::string name, auto remove_copy) {
@@ -53,15 +65,24 @@ int main(int argc, char** argv) {
53
65
->Arg (1024 )
54
66
->Arg (8192 );
55
67
};
68
+ // {std,ranges}::remove_copy
56
69
bm.operator ()<std::vector<int >>(" std::remove_copy(vector<int>) (prefix)" , std_remove_copy);
57
70
bm.operator ()<std::deque<int >>(" std::remove_copy(deque<int>) (prefix)" , std_remove_copy);
58
71
bm.operator ()<std::list<int >>(" std::remove_copy(list<int>) (prefix)" , std_remove_copy);
59
72
bm.operator ()<std::vector<int >>(" rng::remove_copy(vector<int>) (prefix)" , std::ranges::remove_copy);
60
73
bm.operator ()<std::deque<int >>(" rng::remove_copy(deque<int>) (prefix)" , std::ranges::remove_copy);
61
74
bm.operator ()<std::list<int >>(" rng::remove_copy(list<int>) (prefix)" , std::ranges::remove_copy);
75
+
76
+ // {std,ranges}::remove_copy_if
77
+ bm.operator ()<std::vector<int >>(" std::remove_copy_if(vector<int>) (prefix)" , std_remove_copy_if);
78
+ bm.operator ()<std::deque<int >>(" std::remove_copy_if(deque<int>) (prefix)" , std_remove_copy_if);
79
+ bm.operator ()<std::list<int >>(" std::remove_copy_if(list<int>) (prefix)" , std_remove_copy_if);
80
+ bm.operator ()<std::vector<int >>(" rng::remove_copy_if(vector<int>) (prefix)" , ranges_remove_copy_if);
81
+ bm.operator ()<std::deque<int >>(" rng::remove_copy_if(deque<int>) (prefix)" , ranges_remove_copy_if);
82
+ bm.operator ()<std::list<int >>(" rng::remove_copy_if(list<int>) (prefix)" , ranges_remove_copy_if);
62
83
}
63
84
64
- // Benchmark {std,ranges}::remove_copy on a sequence of the form xyxyxyxyxyxyxyxyxyxy
85
+ // Benchmark {std,ranges}::{ remove_copy,remove_copy_if} on a sequence of the form xyxyxyxyxyxyxyxyxyxy
65
86
// where we remove the x's from the sequence.
66
87
{
67
88
auto bm = []<class Container >(std::string name, auto remove_copy) {
@@ -91,12 +112,21 @@ int main(int argc, char** argv) {
91
112
->Arg (1024 )
92
113
->Arg (8192 );
93
114
};
115
+ // {std,ranges}::remove_copy
94
116
bm.operator ()<std::vector<int >>(" std::remove_copy(vector<int>) (sprinkled)" , std_remove_copy);
95
117
bm.operator ()<std::deque<int >>(" std::remove_copy(deque<int>) (sprinkled)" , std_remove_copy);
96
118
bm.operator ()<std::list<int >>(" std::remove_copy(list<int>) (sprinkled)" , std_remove_copy);
97
119
bm.operator ()<std::vector<int >>(" rng::remove_copy(vector<int>) (sprinkled)" , std::ranges::remove_copy);
98
120
bm.operator ()<std::deque<int >>(" rng::remove_copy(deque<int>) (sprinkled)" , std::ranges::remove_copy);
99
121
bm.operator ()<std::list<int >>(" rng::remove_copy(list<int>) (sprinkled)" , std::ranges::remove_copy);
122
+
123
+ // {std,ranges}::remove_copy_if
124
+ bm.operator ()<std::vector<int >>(" std::remove_copy_if(vector<int>) (sprinkled)" , std_remove_copy_if);
125
+ bm.operator ()<std::deque<int >>(" std::remove_copy_if(deque<int>) (sprinkled)" , std_remove_copy_if);
126
+ bm.operator ()<std::list<int >>(" std::remove_copy_if(list<int>) (sprinkled)" , std_remove_copy_if);
127
+ bm.operator ()<std::vector<int >>(" rng::remove_copy_if(vector<int>) (sprinkled)" , ranges_remove_copy_if);
128
+ bm.operator ()<std::deque<int >>(" rng::remove_copy_if(deque<int>) (sprinkled)" , ranges_remove_copy_if);
129
+ bm.operator ()<std::list<int >>(" rng::remove_copy_if(list<int>) (sprinkled)" , ranges_remove_copy_if);
100
130
}
101
131
102
132
benchmark::Initialize (&argc, argv);
0 commit comments