Skip to content

Commit 1b0f252

Browse files
sbenzaquencopybara-github
authored andcommitted
Add a microbenchmark for very long int/string tuples.
PiperOrigin-RevId: 715398493 Change-Id: I5231ed6499e5eb7eff9436e309295d493b91365f
1 parent 6effb00 commit 1b0f252

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

absl/hash/hash_benchmark.cc

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,59 @@ absl::flat_hash_set<T> FlatHashSet(size_t count) {
146146
return result;
147147
}
148148

149+
template <typename T>
150+
struct LongCombine {
151+
T a[200]{};
152+
template <typename H>
153+
friend H AbslHashValue(H state, const LongCombine& v) {
154+
// This is testing a single call to `combine` with a lot of arguments to
155+
// test the performance of the folding logic.
156+
return H::combine(
157+
std::move(state), //
158+
v.a[0], v.a[1], v.a[2], v.a[3], v.a[4], v.a[5], v.a[6], v.a[7], v.a[8],
159+
v.a[9], v.a[10], v.a[11], v.a[12], v.a[13], v.a[14], v.a[15], v.a[16],
160+
v.a[17], v.a[18], v.a[19], v.a[20], v.a[21], v.a[22], v.a[23], v.a[24],
161+
v.a[25], v.a[26], v.a[27], v.a[28], v.a[29], v.a[30], v.a[31], v.a[32],
162+
v.a[33], v.a[34], v.a[35], v.a[36], v.a[37], v.a[38], v.a[39], v.a[40],
163+
v.a[41], v.a[42], v.a[43], v.a[44], v.a[45], v.a[46], v.a[47], v.a[48],
164+
v.a[49], v.a[50], v.a[51], v.a[52], v.a[53], v.a[54], v.a[55], v.a[56],
165+
v.a[57], v.a[58], v.a[59], v.a[60], v.a[61], v.a[62], v.a[63], v.a[64],
166+
v.a[65], v.a[66], v.a[67], v.a[68], v.a[69], v.a[70], v.a[71], v.a[72],
167+
v.a[73], v.a[74], v.a[75], v.a[76], v.a[77], v.a[78], v.a[79], v.a[80],
168+
v.a[81], v.a[82], v.a[83], v.a[84], v.a[85], v.a[86], v.a[87], v.a[88],
169+
v.a[89], v.a[90], v.a[91], v.a[92], v.a[93], v.a[94], v.a[95], v.a[96],
170+
v.a[97], v.a[98], v.a[99], v.a[100], v.a[101], v.a[102], v.a[103],
171+
v.a[104], v.a[105], v.a[106], v.a[107], v.a[108], v.a[109], v.a[110],
172+
v.a[111], v.a[112], v.a[113], v.a[114], v.a[115], v.a[116], v.a[117],
173+
v.a[118], v.a[119], v.a[120], v.a[121], v.a[122], v.a[123], v.a[124],
174+
v.a[125], v.a[126], v.a[127], v.a[128], v.a[129], v.a[130], v.a[131],
175+
v.a[132], v.a[133], v.a[134], v.a[135], v.a[136], v.a[137], v.a[138],
176+
v.a[139], v.a[140], v.a[141], v.a[142], v.a[143], v.a[144], v.a[145],
177+
v.a[146], v.a[147], v.a[148], v.a[149], v.a[150], v.a[151], v.a[152],
178+
v.a[153], v.a[154], v.a[155], v.a[156], v.a[157], v.a[158], v.a[159],
179+
v.a[160], v.a[161], v.a[162], v.a[163], v.a[164], v.a[165], v.a[166],
180+
v.a[167], v.a[168], v.a[169], v.a[170], v.a[171], v.a[172], v.a[173],
181+
v.a[174], v.a[175], v.a[176], v.a[177], v.a[178], v.a[179], v.a[180],
182+
v.a[181], v.a[182], v.a[183], v.a[184], v.a[185], v.a[186], v.a[187],
183+
v.a[188], v.a[189], v.a[190], v.a[191], v.a[192], v.a[193], v.a[194],
184+
v.a[195], v.a[196], v.a[197], v.a[198], v.a[199]);
185+
}
186+
};
187+
188+
template <typename T>
189+
auto MakeLongTuple() {
190+
auto t1 = std::tuple<T>();
191+
auto t2 = std::tuple_cat(t1, t1);
192+
auto t3 = std::tuple_cat(t2, t2);
193+
auto t4 = std::tuple_cat(t3, t3);
194+
auto t5 = std::tuple_cat(t4, t4);
195+
auto t6 = std::tuple_cat(t5, t5);
196+
// Ideally this would be much larger, but some configurations can't handle
197+
// making tuples with that many elements. They break inside std::tuple itself.
198+
static_assert(std::tuple_size<decltype(t6)>::value == 32, "");
199+
return t6;
200+
}
201+
149202
// Generates a benchmark and a codegen method for the provided types. The
150203
// codegen method provides a well known entrypoint for dumping assembly.
151204
#define MAKE_BENCHMARK(hash, name, ...) \
@@ -216,6 +269,10 @@ MAKE_BENCHMARK(AbslHash, PairStringString_200,
216269
std::make_pair(std::string(200, 'a'), std::string(200, 'b')));
217270
MAKE_BENCHMARK(AbslHash, PairStringString_5000,
218271
std::make_pair(std::string(5000, 'a'), std::string(5000, 'b')));
272+
MAKE_BENCHMARK(AbslHash, LongTupleInt32, MakeLongTuple<int>());
273+
MAKE_BENCHMARK(AbslHash, LongTupleString, MakeLongTuple<std::string>());
274+
MAKE_BENCHMARK(AbslHash, LongCombineInt32, LongCombine<int>());
275+
MAKE_BENCHMARK(AbslHash, LongCombineString, LongCombine<std::string>());
219276

220277
MAKE_BENCHMARK(TypeErasedAbslHash, Int32, int32_t{});
221278
MAKE_BENCHMARK(TypeErasedAbslHash, Int64, int64_t{});

0 commit comments

Comments
 (0)