summaryrefslogtreecommitdiff
path: root/graphics/asymptote/seconds.h
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/asymptote/seconds.h')
-rw-r--r--graphics/asymptote/seconds.h52
1 files changed, 27 insertions, 25 deletions
diff --git a/graphics/asymptote/seconds.h b/graphics/asymptote/seconds.h
index 6b72f997b0..b42e692169 100644
--- a/graphics/asymptote/seconds.h
+++ b/graphics/asymptote/seconds.h
@@ -2,6 +2,7 @@
#define __seconds_h__ 1
#include <chrono>
+#include <sys/resource.h>
namespace utils {
@@ -18,28 +19,25 @@ inline double cpuTime() {
#include <unistd.h>
#include <time.h>
-#ifdef HAVE_PTHREAD
-#include <pthread.h>
-#endif
-
inline double cpuTime() {
- timespec t;
- clockid_t cid;
-
#ifdef CLOCK_THREAD_CPUTIME_ID
- cid=CLOCK_THREAD_CPUTIME_ID;
-#else
- #ifdef HAVE_PTHREAD
- pthread_getcpuclockid(pthread_self(),&cid);
- #elif CLOCK_PROCESS_CPUTIME_ID
- cid=CLOCK_PROCESS_CPUTIME_ID;
- #else
- cid=CLOCK_REALTIME;
- #endif
+#define GETTIME_ID CLOCK_THREAD_CPUTIME_ID
+#elif defined(CLOCK_PROCESS_CPUTIME_ID)
+#define GETTIME_ID CLOCK_PROCESS_CPUTIME_ID
#endif
- clock_gettime(cid,&t);
+#ifdef GETTIME_ID
+ timespec t;
+ clock_gettime(GETTIME_ID,&t);
return 1.0e9*t.tv_sec+t.tv_nsec;
+#undef GETTIME_ID
+#else
+ struct rusage ru;
+ if(getrusage(RUSAGE_SELF, &ru))
+ return 0;
+ return 1.0e9*(ru.ru_utime.tv_sec+ru.ru_stime.tv_sec)
+ +1.0e3*(ru.ru_utime.tv_usec+ru.ru_stime.tv_usec);
+#endif
}
#endif
@@ -59,7 +57,8 @@ public:
auto Stop=std::chrono::steady_clock::now();
double ns=std::chrono::duration_cast<std::chrono::nanoseconds>
(Stop-Start).count();
- if(reset) Start=Stop;
+ if(reset)
+ Start=Stop;
return ns;
}
@@ -82,17 +81,20 @@ public:
reset();
}
- double nanoseconds() {
+ double nanoseconds(bool reset=false) {
auto Stop=std::chrono::steady_clock::now();
double stop=cpuTime();
-
- return
- std::min((double) std::chrono::duration_cast<std::chrono::nanoseconds>
- (Stop-Start).count(),stop-start);
+ double ns=std::min((double) std::chrono::duration_cast<std::chrono::nanoseconds>
+ (Stop-Start).count(),stop-start);
+ if(reset) {
+ Start=Stop;
+ start=stop;
+ }
+ return ns;
}
- double seconds() {
- return 1.0e-9*nanoseconds();
+ double seconds(bool reset=false) {
+ return 1.0e-9*nanoseconds(reset);
}
};