Files
ResInsight/ThirdParty/Ert/lib/util/timer.cpp
T
Magne Sjaastad 04091ad77d #4266 Update libecl
Use commit 0e1e780fd6f18ce93119061e36a4fca9711bc020

Excluded multibuild folder, as this caused git issues
2019-05-09 08:40:32 +02:00

143 lines
3.0 KiB
C++

/*
Copyright (C) 2011 Equinor ASA, Norway.
The file 'timer.c' is part of ERT - Ensemble based Reservoir Tool.
ERT is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ERT is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License at <http://www.gnu.org/licenses/gpl.html>
for more details.
*/
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ert/util/util.h>
#include <ert/util/timer.hpp>
#ifdef __cplusplus
extern "C" {
#endif
struct timer_struct {
size_t count;
clock_t clock_start;
time_t epoch_start;
double sum1 , sum2;
double min_time , max_time;
bool running , epoch_time;
};
timer_type * timer_alloc(bool epoch_time) {
timer_type *timer;
timer = (timer_type*)util_malloc(sizeof * timer );
timer->epoch_time = epoch_time;
timer_reset(timer);
return timer;
}
void timer_free(timer_type *timer) {
free(timer);
}
void timer_start(timer_type *timer) {
if (timer->running)
util_abort("%s: Timer already running. Use timer_stop() or timer_restart(). Aborting \n",__func__ );
timer->running = true;
if (timer->epoch_time)
time( &timer->epoch_start );
else
timer->clock_start = clock();
}
double timer_stop(timer_type *timer) {
time_t epoch_time;
clock_t clock_time = clock();
time(&epoch_time);
if (timer->running) {
double cpu_sec;
if (timer->epoch_time)
cpu_sec = 1.0 * (epoch_time - timer->epoch_start);
else
cpu_sec = 1.0 * (clock_time - timer->clock_start) / CLOCKS_PER_SEC;
timer->count++;
timer->sum1 += cpu_sec;
timer->sum2 += cpu_sec * cpu_sec;
timer->min_time = util_double_min( timer->min_time , cpu_sec);
timer->max_time = util_double_max( timer->max_time , cpu_sec);
timer->running = false;
return cpu_sec;
} else
util_abort("%s: Timer is not running. Aborting \n",__func__ );
return -1;
}
void timer_reset(timer_type *timer) {
timer->count = 0;
timer->sum1 = 0.0;
timer->sum2 = 0.0;
timer->min_time = 99999999;
timer->max_time = -99999999;
timer->running = false;
}
void timer_stats(const timer_type *timer , double *mean, double *std_dev) {
*mean = timer->sum1 / timer->count;
*std_dev = sqrt(timer->sum2 / timer->count - (*mean) * (*mean));
}
double timer_get_total_time(const timer_type *timer) {
return timer->sum1;
}
double timer_get_max_time(const timer_type *timer) {
return timer->max_time;
}
double timer_get_min_time(const timer_type *timer) {
return timer->min_time;
}
double timer_get_avg_time(const timer_type *timer) {
return timer->sum1 / timer->count;
}
#ifdef __cplusplus
}
#endif