115 JParser<> zap(
"Example program to test performance of merge sort.");
122 catch(
const exception &error) {
123 FATAL(error.what() << endl);
127 if (rate_Hz <= 0.0) {
128 FATAL(
"Rate " << rate_Hz <<
" < 0 Hz." << endl);
131 const double period = 1.0e9 / rate_Hz;
133 const double Tmin = 0.0;
134 const double Tmax = 1.0e8;
136 const int NUMBER_OF_PMTS = 31;
137 const int NUMBER_OF_MODULES = 115 * 18;
141 typedef double hit_type;
143 const JElement_t getElement;
150 JBuffer2D input(NUMBER_OF_PMTS);
152 size_t number_of_hits = 0;
154 for (
int i = 0; i != NUMBER_OF_PMTS; ++i) {
156 for (
double t1 = Tmin + gRandom->Exp(period); t1 < Tmax; t1 += gRandom->Exp(period), ++number_of_hits) {
157 input[i].push_back(getElement(t1));
160 NOTICE(
"PMT[" << setw(2) << i <<
"] " << input[i].size() << endl);
162 putEndMarker(input[i], JElement_t::getEndMarker());
168 JTimer(
"std::inplace_merge"),
176 for (
int i = 0; i != NUMBER_OF_MODULES; ++i) {
182 for (
int i = 0; i != NUMBER_OF_PMTS; ++i) {
183 copy(input[i].begin(), input[i].end(), back_inserter(buffer));
186 std::sort(buffer.begin(), buffer.end());
190 ASSERT(buffer.size() == number_of_hits,
"Test std::sort.");
191 ASSERT(is_sorted(buffer.begin(), buffer.end()),
"Test std::sort.");
200 for (
int i = 0; i != NUMBER_OF_MODULES; ++i) {
206 for (
int i = 0; i != NUMBER_OF_PMTS; ++i) {
207 n += input[i].size();
212 JBuffer1D::iterator out = buffer.begin();
216 for (
int i = 0; i != NUMBER_OF_PMTS; ++i) {
218 out = copy(input[i].begin(), input[i].end(), out);
220 delimiter[i+1] =
distance(buffer.begin(), out);
223 inplace_merge(buffer.begin(), delimiter.size(), delimiter.data());
227 ASSERT(buffer.size() == number_of_hits,
"Test std::inplace_merge.");
228 ASSERT(is_sorted(buffer.begin(), buffer.end()),
"Test std::inplace_merge.");
236 for (
int i = 0; i != NUMBER_OF_MODULES; ++i) {
242 merge(input, buffer);
246 ASSERT(buffer.size() == number_of_hits,
"Test JMergeSort.");
247 ASSERT(is_sorted(buffer.begin(), buffer.end()),
"Test JMergeSort.");
252 for (
int i = 0; i !=
sizeof(timer)/
sizeof(timer[0]); ++i) {
253 timer[i].
print(cout,
false);
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.