@@ -22,7 +22,7 @@ template <typename T1,
22
22
void printLine (const char fill, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5, T6 t6, T7 t7)
23
23
{
24
24
std::cout << std::left << std::setw (3 ) << std::setfill (fill) << " | " ;
25
- std::cout << std::left << std::setw (15 ) << std::setfill (fill) << t1
25
+ std::cout << std::left << std::setw (18 ) << std::setfill (fill) << t1
26
26
<< " | " ;
27
27
std::cout << std::left << std::setw (13 ) << std::setfill (fill) << t2
28
28
<< " | " ;
@@ -82,6 +82,60 @@ void run_bench(const std::string datatype)
82
82
std::cout << std::setprecision (ss);
83
83
}
84
84
85
+ template <typename K, typename V = uint64_t >
86
+ void run_bench_kv (const std::string datatype)
87
+ {
88
+ std::streamsize ss = std::cout.precision ();
89
+ std::cout << std::fixed;
90
+ std::cout << std::setprecision (1 );
91
+ std::vector<int > array_sizes = {10000 , 100000 , 1000000 };
92
+ for (auto size : array_sizes) {
93
+ std::vector<K> keys;
94
+ std::vector<V> values;
95
+ std::vector<sorted_t <K, V>> sortedarr;
96
+
97
+ if (datatype.find (" kv_uniform" ) != std::string::npos) {
98
+ keys = get_uniform_rand_array<K>(size);
99
+ }
100
+ else if (datatype.find (" kv_reverse" ) != std::string::npos) {
101
+ for (int ii = 0 ; ii < size; ++ii) {
102
+ // arr.emplace_back((T)(size - ii));
103
+ keys.emplace_back ((K)(size - ii));
104
+ }
105
+ }
106
+ else if (datatype.find (" kv_ordered" ) != std::string::npos) {
107
+ for (int ii = 0 ; ii < size; ++ii) {
108
+ keys.emplace_back ((ii));
109
+ }
110
+ }
111
+ else if (datatype.find (" kv_limited" ) != std::string::npos) {
112
+ keys = get_uniform_rand_array<K>(size, (K)10 , (K)0 );
113
+ }
114
+ else {
115
+ std::cout << " Skipping unrecognized array type: " << datatype
116
+ << std::endl;
117
+ return ;
118
+ }
119
+ values = get_uniform_rand_array<V>(size);
120
+ for (size_t i = 0 ; i < keys.size (); i++) {
121
+ sorted_t <K, V> tmp_s;
122
+ tmp_s.key = keys[i];
123
+ tmp_s.value = values[i];
124
+ sortedarr.emplace_back (tmp_s);
125
+ }
126
+
127
+ auto out = bench_sort_kv (keys, values, sortedarr, 20 , 10 );
128
+ printLine (' ' ,
129
+ datatype,
130
+ typeid (K).name (),
131
+ sizeof (K),
132
+ size,
133
+ std::get<0 >(out),
134
+ std::get<1 >(out),
135
+ (float )std::get<1 >(out) / std::get<0 >(out));
136
+ }
137
+ std::cout << std::setprecision (ss);
138
+ }
85
139
void bench_all (const std::string datatype)
86
140
{
87
141
if (cpu_has_avx512bw ()) {
@@ -97,7 +151,15 @@ void bench_all(const std::string datatype)
97
151
}
98
152
}
99
153
}
154
+ void bench_all_kv (const std::string datatype)
155
+ {
156
+ if (cpu_has_avx512bw ()) {
100
157
158
+ run_bench_kv<uint64_t >(datatype);
159
+ run_bench_kv<int64_t >(datatype);
160
+ run_bench_kv<double >(datatype);
161
+ }
162
+ }
101
163
int main (/* int argc, char *argv[]*/ )
102
164
{
103
165
printLine (' ' ,
@@ -113,6 +175,11 @@ int main(/*int argc, char *argv[]*/)
113
175
bench_all (" reverse" );
114
176
bench_all (" ordered" );
115
177
bench_all (" limitedrange" );
178
+
179
+ bench_all_kv (" kv_uniform random" );
180
+ bench_all_kv (" kv_reverse" );
181
+ bench_all_kv (" kv_ordered" );
182
+ bench_all_kv (" kv_limitedrange" );
116
183
printLine (' -' , " " , " " , " " , " " , " " , " " , " " );
117
184
return 0 ;
118
185
}
0 commit comments