Skip to content

Commit d4b5eb6

Browse files
authored
Made some subfilters' lookup branchless (#42)
* made fast_multiblock32, fast_multiblock64 and block (for array block types) branchless * added mixed lookup to comparison tables * typo * updated benchmarks * updated release notes
1 parent 2c38932 commit d4b5eb6

File tree

8 files changed

+926
-649
lines changed

8 files changed

+926
-649
lines changed

benchmark/comparison_table.cpp

Lines changed: 42 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ void resume_timing()
6262
#include <cstdlib>
6363
#include <iomanip>
6464
#include <iostream>
65+
#include <limits>
6566
#include <string>
6667
#include <vector>
6768

@@ -85,14 +86,20 @@ struct test_results
8586
double insertion_time; /* ns per element */
8687
double successful_lookup_time; /* ns per element */
8788
double unsuccessful_lookup_time; /* ns per element */
89+
double mixed_lookup_time; /* ns per element */
8890
};
8991

9092
template<typename Filter>
9193
test_results test(std::size_t c)
9294
{
9395
using value_type=typename Filter::value_type;
9496

95-
std::vector<value_type> data_in,data_out;
97+
static constexpr double lookup_mix=0.1; /* successful pr. */
98+
static constexpr std::uint64_t mixed_lookup_cut=
99+
(std::uint64_t)(
100+
lookup_mix*(double)(std::numeric_limits<std::uint64_t>::max)());
101+
102+
std::vector<value_type> data_in,data_out,data_mixed;
96103
{
97104
boost::detail::splitmix64 rng;
98105
boost::unordered_flat_set<value_type> unique;
@@ -114,6 +121,9 @@ test_results test(std::size_t c)
114121
}
115122
}
116123
}
124+
for(std::size_t i=0;i<num_elements;++i){
125+
data_mixed.push_back(rng()<mixed_lookup_cut?data_in[i]:data_out[i]);
126+
}
117127
}
118128

119129
double fpr=0.0;
@@ -143,6 +153,7 @@ test_results test(std::size_t c)
143153

144154
double successful_lookup_time=0.0;
145155
double unsuccessful_lookup_time=0.0;
156+
double mixed_lookup_time=0.0;
146157
{
147158
Filter f(c*num_elements);
148159
for(const auto& x:data_in)f.insert(x);
@@ -158,9 +169,17 @@ test_results test(std::size_t c)
158169
return res;
159170
});
160171
unsuccessful_lookup_time=t/num_elements*1E9;
172+
t=measure([&]{
173+
std::size_t res=0;
174+
for(const auto& x:data_mixed)res+=f.may_contain(x);
175+
return res;
176+
});
177+
mixed_lookup_time=t/num_elements*1E9;
161178
}
162179

163-
return {fpr,insertion_time,successful_lookup_time,unsuccessful_lookup_time};
180+
return {
181+
fpr,insertion_time,
182+
successful_lookup_time,unsuccessful_lookup_time,mixed_lookup_time};
164183
}
165184

166185
struct print_double
@@ -196,7 +215,8 @@ template<typename Filters> void row(std::size_t c)
196215
" <td align=\"right\">"<<print_double(res.fpr,4)<<"</td>\n"
197216
" <td align=\"right\">"<<print_double(res.insertion_time)<<"</td>\n"
198217
" <td align=\"right\">"<<print_double(res.successful_lookup_time)<<"</td>\n"
199-
" <td align=\"right\">"<<print_double(res.unsuccessful_lookup_time)<<"</td>\n";
218+
" <td align=\"right\">"<<print_double(res.unsuccessful_lookup_time)<<"</td>\n"
219+
" <td align=\"right\">"<<print_double(res.mixed_lookup_time)<<"</td>\n";
200220
});
201221

202222
std::cout<<
@@ -251,17 +271,19 @@ int main(int argc,char* argv[])
251271

252272
auto res=test<unordered_flat_set_filter<int>>(0);
253273
std::cout<<
254-
"<table>\n"
255-
" <tr><th colspan=\"3\"><code>boost::unordered_flat_set</code></tr>\n"
274+
"<table class=\"bordered_table\" style=\"font-size: 85%;\">\n"
275+
" <tr><th colspan=\"4\"><code>boost::unordered_flat_set</code></tr>\n"
256276
" <tr>\n"
257277
" <th>insertion</th>\n"
258278
" <th>successful<br/>lookup</th>\n"
259279
" <th>unsuccessful<br/>lookup</th>\n"
280+
" <th>mixed<br/>lookup</th>\n"
260281
" </tr>\n"
261282
" <tr>\n"
262283
" <td align=\"right\">"<<print_double(res.insertion_time)<<"</td>\n"
263284
" <td align=\"right\">"<<print_double(res.successful_lookup_time)<<"</td>\n"
264285
" <td align=\"right\">"<<print_double(res.unsuccessful_lookup_time)<<"</td>\n"
286+
" <td align=\"right\">"<<print_double(res.mixed_lookup_time)<<"</td>\n"
265287
" </tr>\n"
266288
"</table>\n";
267289

@@ -272,15 +294,16 @@ int main(int argc,char* argv[])
272294
" <th>FPR<br/>[%]</th>\n"
273295
" <th>ins.</th>\n"
274296
" <th>succ.<br/>lkp.</th>\n"
275-
" <th>uns.<br/>lkp.</th>\n";
297+
" <th>uns.<br/>lkp.</th>\n"
298+
" <th>mixed<br/>lkp.</th>\n";
276299

277300
std::cout<<
278-
"<table>\n"
301+
"<table class=\"bordered_table\" style=\"font-size: 85%;\">\n"
279302
" <tr>\n"
280303
" <th></th>\n"
281-
" <th colspan=\"5\"><code>filter&lt;int,K></code></th>\n"
282-
" <th colspan=\"5\"><code>filter&lt;int,1,block&lt;uint64_t,K>></code></th>\n"
283-
" <th colspan=\"5\"><code>filter&lt;int,1,block&lt;uint64_t,K>,1></code></th>\n"
304+
" <th colspan=\"6\"><code>filter&lt;int,K></code></th>\n"
305+
" <th colspan=\"6\"><code>filter&lt;int,1,block&lt;uint64_t,K>></code></th>\n"
306+
" <th colspan=\"6\"><code>filter&lt;int,1,block&lt;uint64_t,K>,1></code></th>\n"
284307
" </tr>\n"
285308
" <tr>\n"
286309
" <th>c</th>\n"<<
@@ -297,9 +320,9 @@ int main(int argc,char* argv[])
297320
std::cout<<
298321
" <tr>\n"
299322
" <th></th>\n"
300-
" <th colspan=\"5\"><code>filter&lt;int,1,multiblock&lt;uint64_t,K>></code></th>\n"
301-
" <th colspan=\"5\"><code>filter&lt;int,1,multiblock&lt;uint64_t,K>,1></code></th>\n"
302-
" <th colspan=\"5\"><code>filter&lt;int,1,fast_multiblock32&lt;K>></code></th>\n"
323+
" <th colspan=\"6\"><code>filter&lt;int,1,multiblock&lt;uint64_t,K>></code></th>\n"
324+
" <th colspan=\"6\"><code>filter&lt;int,1,multiblock&lt;uint64_t,K>,1></code></th>\n"
325+
" <th colspan=\"6\"><code>filter&lt;int,1,fast_multiblock32&lt;K>></code></th>\n"
303326
" </tr>\n"
304327
" <tr>\n"
305328
" <th>c</th>\n"<<
@@ -316,9 +339,9 @@ int main(int argc,char* argv[])
316339
std::cout<<
317340
" <tr>\n"
318341
" <th></th>\n"
319-
" <th colspan=\"5\"><code>filter&lt;int,1,fast_multiblock32&lt;K>,1></code></th>\n"
320-
" <th colspan=\"5\"><code>filter&lt;int,1,fast_multiblock64&lt;K>></code></th>\n"
321-
" <th colspan=\"5\"><code>filter&lt;int,1,fast_multiblock64&lt;K>,1></code></th>\n"
342+
" <th colspan=\"6\"><code>filter&lt;int,1,fast_multiblock32&lt;K>,1></code></th>\n"
343+
" <th colspan=\"6\"><code>filter&lt;int,1,fast_multiblock64&lt;K>></code></th>\n"
344+
" <th colspan=\"6\"><code>filter&lt;int,1,fast_multiblock64&lt;K>,1></code></th>\n"
322345
" </tr>\n"
323346
" <tr>\n"
324347
" <th>c</th>\n"<<
@@ -335,9 +358,9 @@ int main(int argc,char* argv[])
335358
std::cout<<
336359
" <tr>\n"
337360
" <th></th>\n"
338-
" <th colspan=\"5\"><code>filter&lt;int,1,block&lt;uint64_t[8],K>></code></th>\n"
339-
" <th colspan=\"5\"><code>filter&lt;int,1,block&lt;uint64_t[8],K>,1></code></th>\n"
340-
" <th colspan=\"5\"><code>filter&lt;int,1,multiblock&lt;uint64_t[8],K>></code></th>\n"
361+
" <th colspan=\"6\"><code>filter&lt;int,1,block&lt;uint64_t[8],K>></code></th>\n"
362+
" <th colspan=\"6\"><code>filter&lt;int,1,block&lt;uint64_t[8],K>,1></code></th>\n"
363+
" <th colspan=\"6\"><code>filter&lt;int,1,multiblock&lt;uint64_t[8],K>></code></th>\n"
341364
" </tr>\n"
342365
" <tr>\n"
343366
" <th>c</th>\n"<<

0 commit comments

Comments
 (0)