You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

231 lines
6.2 KiB
C++

/*
* metrics implementation
*
* Copyright (C) Thomas Escher, Kai Lingemann
*
* Released under the GPL version 3.
*
*/
#include "scanserver/metrics.h"
#ifdef _MSC_VER
LARGE_INTEGER TimeMetric::frequency;
bool TimeMetric::init = false;
#endif
TimeMetric::TimeMetric(unsigned int reserve) :
Metric(reserve)
{
#ifdef _MSC_VER
if(!TimeMetric::init) {
QueryPerformanceFrequency(&TimeMetric::frequency);
TimeMetric::init = true;
}
#endif
}
Timer TimeMetric::start()
{
Timer start;
#ifdef _MSC_VER
QueryPerformanceCounter(&start);
#else
gettimeofday(&start, 0);
#endif
return start;
}
void TimeMetric::end(Timer& start)
{
double delta;
#ifdef _MSC_VER
LARGE_INTEGER end;
QueryPerformanceCounter(&end);
delta = (double)(end.QuadPart - start.QuadPart) / frequency.QuadPart;
#else
timeval end;
gettimeofday(&end, 0);
delta = (double)(end.tv_sec - start.tv_sec)
+ (double)(end.tv_usec - start.tv_usec) / 1000000.0;
#endif
commit(delta);
}
CounterMetric::CounterMetric(unsigned int reserve) :
Metric(reserve)
{
}
void CounterMetric::add(unsigned long long value)
{
commit(value);
}
#include <iostream>
using std::cout;
using std::endl;
TimeMetric ServerMetric::scan_loading, ServerMetric::cacheio_write_time, ServerMetric::cacheio_read_time;
CounterMetric ServerMetric::cacheio_write_size, ServerMetric::cacheio_read_size;
TimeMetric
ClientMetric::read_scan_time,
ClientMetric::scan_load_time,
ClientMetric::calc_reduced_points_time,
ClientMetric::transform_time(100000), // avoid resizing in multithreaded transform calls by graph-slam
ClientMetric::copy_original_time,
ClientMetric::create_tree_time,
ClientMetric::on_demand_reduction_time,
ClientMetric::create_metatree_time,
ClientMetric::add_frames_time,
ClientMetric::matching_time,
ClientMetric::clientinterface_time,
ClientMetric::cache_miss_time,
ClientMetric::allocate_time,
ClientMetric::frames_time;
void printTime(const TimeMetric& m, unsigned int indentation = 1)
{
for(unsigned int i = 1; i <= indentation; ++i) {
cout << " ";
}
cout << m.sum() << "s";
if(m.size() != 1) {
cout << " (" << m.average() << "s average of " << m.size() << " calls)";
}
cout << endl;
}
void ServerMetric::print()
{
cout << "= Metric server information =" << endl
<< "Time spent for loading scans (in ScanHandler::load):" << endl
<< " Amount: " << scan_loading.size() << endl
<< " Time: " << scan_loading.sum() << "s (" << scan_loading.average() << "s avg.)" << endl
<< endl
<< "CacheIO reads:" << endl
<< " Amount: " << cacheio_read_size.size() << endl
<< " Size: " << cacheio_read_size.sum()/1024/1024 << "MB (" << cacheio_read_size.average()/1024 << "KB avg.)" << endl
<< " Time: " << cacheio_read_time.sum() << "s (" << cacheio_read_time.average() << "s avg.)" << endl
<< endl
<< "CacheIO writes:" << endl
<< " Amount: " << cacheio_write_size.size() << endl
<< " Size: " << cacheio_write_size.sum()/1024/1024 << "MB (" << cacheio_write_size.average()/1024 << "KB avg.)" << endl
<< " Time: " << cacheio_write_time.sum() << "s (" << cacheio_write_time.average() << "s avg.)" << endl
<< "= Resetting metric information =" << endl
<< endl;
scan_loading.reset();
cacheio_write_time.reset();
cacheio_read_time.reset();
cacheio_write_size.reset();
cacheio_read_size.reset();
}
void ClientMetric::print()
{
cout << "= Metric client information =" << endl;
// ClientInterface specific ones
#ifdef WITH_SCANSERVER
cout << "Time for all ClientInterface messages:" << endl;
printTime(clientinterface_time);
cout << " [" << endl;
cout << " Time for cache misses:" << endl;
printTime(cache_miss_time, 3);
cout << " Time for cache allocations:" << endl;
printTime(allocate_time, 3);
// TODO: invalidations too?
cout << " Time for frame calls:" << endl;
printTime(frames_time, 3);
cout << " ]" << endl;
cout << endl;
#endif //WITH_SCANSERVER
// Scan: Loading, reducing and SearchTree related ones
#ifdef WITH_SCANSERVER
// barebone preparation and parameter setting
if(read_scan_time.size()) {
cout << "Time for loading directory:" << endl;
printTime(read_scan_time);
}
// getXYZ in calcReducedPoints
if(scan_load_time.size()) {
cout << "Time for loading scans:" << endl;
printTime(scan_load_time);
}
#else //WITH_SCANSERVER
// load all scans
if(read_scan_time.size()) {
cout << "Time for loading directory and scans:" << endl;
printTime(read_scan_time);
}
#endif //WITH_SCANSERVER
if(calc_reduced_points_time.size()) {
cout << "Time for reducing scans:" << endl;
printTime(calc_reduced_points_time);
}
// old: red_lum for SearchTree, duplicating all contained reduced points and copying them into red_lum again for MetaScans
// new: caching reduced points for saving time
if(copy_original_time.size()) {
cout << "Time for copying reduced points:" << endl;
printTime(copy_original_time);
}
if(create_tree_time.size()) {
cout << "Time for creating SearchTree:" << endl;
printTime(create_tree_time);
}
#ifdef WITH_SCANSERVER
// only for new, replaces copying reduced points from old
if(create_metatree_time.size()) {
cout << "Time for creating meta-SearchTree:" << endl;
printTime(create_metatree_time);
}
if(on_demand_reduction_time.size()) {
cout << "Time in on-demand reduction [reduction+transform+copy / copy]:" << endl;
printTime(on_demand_reduction_time);
}
#endif //WITH_SCANSERVER
if(transform_time.size()) {
cout << "Time for transform:" << endl;
printTime(transform_time);
}
// SLAM
if(matching_time.size()) {
cout << endl;
cout << "Matching time:" << endl;
printTime(matching_time);
#ifdef WITH_SCANSERVER
cout << "Corrected matching time without on-demand loading, reduction and tree creation:" << endl;
// match - scan loading in calcReducedPoints - calcReducedPoints - transform (irrelevant) - copy to original - createTree
cout << " " <<
matching_time.sum()
- scan_load_time.sum()
- calc_reduced_points_time.sum()
- copy_original_time.sum()
- create_tree_time.sum()
<< "s" << endl;
#endif //WITH_SCANSERVER
}
cout << endl;
}