106{
108
109 double rate_Hz;
111
112 try {
113
114 JParser<> zap(
"Example program to test performance of merge sort.");
115
118
119 zap(argc, argv);
120 }
121 catch(const exception &error) {
122 FATAL(error.what() << endl);
123 }
124
125
127
128 if (rate_Hz <= 0.0) {
129 FATAL(
"Rate " << rate_Hz <<
" < 0 Hz." << endl);
130 }
131
132 const double period = 1.0e9 / rate_Hz;
133
134 const double Tmin = 0.0;
135 const double Tmax = 1.0e8;
136
137 const int NUMBER_OF_PMTS = 31;
138 const int NUMBER_OF_MODULES = 115 * 18;
139
140
141
142 typedef double hit_type;
144 const JElement_t getElement;
147
148
149
150
151 JBuffer2D input(NUMBER_OF_PMTS);
152
153 size_t number_of_hits = 0;
154
155 for (int i = 0; i != NUMBER_OF_PMTS; ++i) {
156
157 for (
double t1 = Tmin + gRandom->Exp(period); t1 < Tmax; t1 += gRandom->
Exp(period), ++number_of_hits) {
158 input[i].push_back(getElement(t1));
159 }
160
161 NOTICE(
"PMT[" << setw(2) << i <<
"] " << input[i].size() << endl);
162
164 }
165
166
169 JTimer(
"std::inplace_merge"),
171 };
172
173
174 {
175 JBuffer1D buffer;
176
177 for (int i = 0; i != NUMBER_OF_MODULES; ++i) {
178
180
181 buffer.clear();
182
183 for (int i = 0; i != NUMBER_OF_PMTS; ++i) {
184 copy(input[i].begin(), input[i].end(), back_inserter(buffer));
185 }
186
187 std::sort(buffer.begin(), buffer.end());
188
190
191 ASSERT(buffer.size() == number_of_hits,
"Test std::sort.");
192 ASSERT(is_sorted(buffer.begin(), buffer.end()),
"Test std::sort.");
193 }
194 }
195
196 {
197 JBuffer1D buffer;
198
200
201 for (int i = 0; i != NUMBER_OF_MODULES; ++i) {
202
204
206
207 for (int i = 0; i != NUMBER_OF_PMTS; ++i) {
208 n += input[i].size();
209 }
210
211 buffer.resize(n);
212
213 JBuffer1D::iterator out = buffer.begin();
214
215 delimiter[0] = 0;
216
217 for (int i = 0; i != NUMBER_OF_PMTS; ++i) {
218
219 out =
copy(input[i].begin(), input[i].end(), out);
220
221 delimiter[i+1] =
distance(buffer.begin(), out);
222 }
223
224 inplace_merge(buffer.begin(), delimiter.size(), delimiter.data());
225
227
228 ASSERT(buffer.size() == number_of_hits,
"Test std::inplace_merge.");
229 ASSERT(is_sorted(buffer.begin(), buffer.end()),
"Test std::inplace_merge.");
230 }
231 }
232
233 {
234 JBuffer1D buffer;
236
237 for (int i = 0; i != NUMBER_OF_MODULES; ++i) {
238
240
241 buffer.clear();
242
243 merge(input, buffer);
244
246
247 ASSERT(buffer.size() == number_of_hits,
"Test JMergeSort.");
248 ASSERT(is_sorted(buffer.begin(), buffer.end()),
"Test JMergeSort.");
249 }
250 }
251
252
253 for (int i = 0; i != sizeof(timer)/sizeof(timer[0]); ++i) {
254 timer[i].
print(cout,
false);
255 }
256}
#define ASSERT(A,...)
Assert macro.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
Auxiliary class for CPU timing and usage.
void print(std::ostream &out, const JScale_t scale=milli_t) const
Print timer data.
Utility class to parse command line options.
void copy(const Head &from, JHead &to)
Copy header from from to to.
void putEndMarker(std::vector< JElement_t, JAllocator_t > &buffer, const JElement_t &value)
Put end marker.
JExp< JF1_t > Exp(const JF1_t &f1)
Exponent of function.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).