1 changed files with 159 additions and 159 deletions
@ -1,159 +1,159 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
**********/ |
|||
|
|||
/* |
|||
* Date and time utility functions |
|||
*/ |
|||
|
|||
#include "ngspice/ngspice.h" |
|||
#include <string.h> |
|||
|
|||
#if defined(HAS_WINGUI) || defined(__MINGW32__) || defined(_MSC_VER) |
|||
#define WIN32_LEAN_AND_MEAN |
|||
|
|||
#include <windows.h> |
|||
#ifndef HAVE_GETTIMEOFDAY |
|||
#include <winsock2.h> |
|||
#include <stdint.h> // portable: uint64_t MSVC: __int64 |
|||
|
|||
/*/ MSVC defines this in winsock2.h!? |
|||
typedef struct timeval { |
|||
long tv_sec; |
|||
long tv_usec; |
|||
} timeval; |
|||
*/ |
|||
int gettimeofday(struct timeval * tp, void * unused) |
|||
{ |
|||
NG_IGNORE(unused); |
|||
// Note: some broken versions only have 8 trailing zero's, the correct epoch has 9 trailing zero's |
|||
// This magic number is the number of 100 nanosecond intervals since January 1, 1601 (UTC) |
|||
// until 00:00:00 January 1, 1970 |
|||
static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL); |
|||
|
|||
SYSTEMTIME system_time; |
|||
FILETIME file_time; |
|||
uint64_t time; |
|||
|
|||
GetSystemTime( &system_time ); |
|||
SystemTimeToFileTime( &system_time, &file_time ); |
|||
time = ((uint64_t)file_time.dwLowDateTime ) ; |
|||
time += ((uint64_t)file_time.dwHighDateTime) << 32; |
|||
|
|||
tp->tv_sec = (long) ((time - EPOCH) / 10000000L); |
|||
tp->tv_usec = (long) (system_time.wMilliseconds * 1000); |
|||
return 0; |
|||
} |
|||
#endif |
|||
#endif |
|||
|
|||
#include "misc_time.h" |
|||
|
|||
#ifdef USE_OMP |
|||
#include <omp.h> |
|||
#endif |
|||
|
|||
/* Return the date. Return value is static data. */ |
|||
|
|||
char * |
|||
datestring(void) |
|||
{ |
|||
|
|||
#ifdef HAVE_LOCALTIME |
|||
static char tbuf[45]; |
|||
struct tm *tp; |
|||
char *ap; |
|||
size_t i; |
|||
|
|||
time_t tloc; |
|||
time(&tloc); |
|||
tp = localtime(&tloc); |
|||
ap = asctime(tp); |
|||
(void) sprintf(tbuf, "%.20s", ap); |
|||
(void) strcat(tbuf, ap + 19); |
|||
i = strlen(tbuf); |
|||
tbuf[i - 1] = '\0'; |
|||
return (tbuf); |
|||
|
|||
#else |
|||
|
|||
return ("today"); |
|||
|
|||
#endif |
|||
} |
|||
|
|||
/* return time interval in seconds and milliseconds */ |
|||
|
|||
PerfTime timebegin; |
|||
|
|||
void timediff(PerfTime *now, PerfTime *begin, int *sec, int *msec) |
|||
{ |
|||
|
|||
*msec = (int) now->milliseconds - (int) begin->milliseconds; |
|||
*sec = (int) now->seconds - (int) begin->seconds; |
|||
if (*msec < 0) { |
|||
*msec += 1000; |
|||
(*sec)--; |
|||
} |
|||
return; |
|||
|
|||
} |
|||
|
|||
/* |
|||
* How many seconds have elapsed in running time. |
|||
* This is the routine called in IFseconds |
|||
*/ |
|||
|
|||
double |
|||
seconds(void) |
|||
{ |
|||
#ifdef USE_OMP |
|||
// Usage of OpenMP time function |
|||
return(omp_get_wtime() - timebegin.secs); |
|||
#elif defined(HAVE_QUERYPERFORMANCECOUNTER) |
|||
// Windows (MSC and mingw) specific implementation |
|||
LARGE_INTEGER frequency, counter; |
|||
QueryPerformanceFrequency(&frequency); |
|||
QueryPerformanceCounter(&counter); |
|||
return ((double)counter.QuadPart / frequency.QuadPart - timebegin.secs); |
|||
#elif defined(HAVE_CLOCK_GETTIME) |
|||
struct timespec ts; |
|||
clock_gettime(CLOCK_MONOTONIC, &ts); |
|||
return (ts.tv_sec + ts.tv_nsec / 1e9 - timebegin.secs); |
|||
#elif defined(HAVE_GETTIMEOFDAY) |
|||
// Usage of gettimeofday |
|||
struct timeval tv; |
|||
gettimeofday(&tv, NULL); |
|||
return (tv.tv_sec + tv.tv_usec / 1e6 - timebegin.secs); |
|||
#elif defined(HAVE_FTIME) |
|||
// Usage of ftime |
|||
struct timeb tb; |
|||
PerfTime timenow; |
|||
int sec, msec; |
|||
ftime(&tb); |
|||
timenow.seconds = tb.time; |
|||
timenow.milliseconds = tb.millitm; |
|||
timediff(&timenow, &timebegin, &sec, &msec); |
|||
return(sec + (double) msec / 1000.0); |
|||
#elif defined(HAVE_TIMES) |
|||
// Usage of times |
|||
struct tms tmsbuf; |
|||
clock_t ticks = times(&tmsbuf); |
|||
return((double) tmsbuf.tms_utime / HZ); |
|||
#elif defined(HAVE_GETRUSAGE) |
|||
// Usage of getrusage |
|||
struct rusage ruse; |
|||
getrusage(RUSAGE_SELF, &ruse); |
|||
return ((double)ruse.ru_utime.tv_sec + (double) ruse.ru_utime.tv_usec / 1000000.0); |
|||
#else |
|||
#error "No timer function available." |
|||
#endif |
|||
} |
|||
|
|||
void perf_timer_get_time(PerfTime *time) |
|||
{ |
|||
time->secs = seconds(); |
|||
time->seconds = (int)time->secs; |
|||
time->milliseconds = (int)((time->secs - time->seconds) * 1000.0); |
|||
|
|||
} |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
**********/ |
|||
|
|||
/* |
|||
* Date and time utility functions |
|||
*/ |
|||
|
|||
#include "ngspice/ngspice.h" |
|||
#include <string.h> |
|||
|
|||
#if defined(HAS_WINGUI) || defined(__MINGW32__) || defined(_MSC_VER) |
|||
#define WIN32_LEAN_AND_MEAN |
|||
|
|||
#include <windows.h> |
|||
#ifndef HAVE_GETTIMEOFDAY |
|||
#include <winsock2.h> |
|||
#include <stdint.h> // portable: uint64_t MSVC: __int64 |
|||
|
|||
/*/ MSVC defines this in winsock2.h!? |
|||
typedef struct timeval { |
|||
long tv_sec; |
|||
long tv_usec; |
|||
} timeval; |
|||
*/ |
|||
int gettimeofday(struct timeval * tp, void * unused) |
|||
{ |
|||
NG_IGNORE(unused); |
|||
// Note: some broken versions only have 8 trailing zero's, the correct epoch has 9 trailing zero's |
|||
// This magic number is the number of 100 nanosecond intervals since January 1, 1601 (UTC) |
|||
// until 00:00:00 January 1, 1970 |
|||
static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL); |
|||
|
|||
SYSTEMTIME system_time; |
|||
FILETIME file_time; |
|||
uint64_t time; |
|||
|
|||
GetSystemTime( &system_time ); |
|||
SystemTimeToFileTime( &system_time, &file_time ); |
|||
time = ((uint64_t)file_time.dwLowDateTime ) ; |
|||
time += ((uint64_t)file_time.dwHighDateTime) << 32; |
|||
|
|||
tp->tv_sec = (long) ((time - EPOCH) / 10000000L); |
|||
tp->tv_usec = (long) (system_time.wMilliseconds * 1000); |
|||
return 0; |
|||
} |
|||
#endif |
|||
#endif |
|||
|
|||
#include "misc_time.h" |
|||
|
|||
#ifdef USE_OMP |
|||
#include <omp.h> |
|||
#endif |
|||
|
|||
/* Return the date. Return value is static data. */ |
|||
|
|||
char * |
|||
datestring(void) |
|||
{ |
|||
|
|||
#ifdef HAVE_LOCALTIME |
|||
static char tbuf[45]; |
|||
struct tm *tp; |
|||
char *ap; |
|||
size_t i; |
|||
|
|||
time_t tloc; |
|||
time(&tloc); |
|||
tp = localtime(&tloc); |
|||
ap = asctime(tp); |
|||
(void) sprintf(tbuf, "%.20s", ap); |
|||
(void) strcat(tbuf, ap + 19); |
|||
i = strlen(tbuf); |
|||
tbuf[i - 1] = '\0'; |
|||
return (tbuf); |
|||
|
|||
#else |
|||
|
|||
return ("today"); |
|||
|
|||
#endif |
|||
} |
|||
|
|||
/* return time interval in seconds and milliseconds */ |
|||
|
|||
PerfTime timebegin; |
|||
|
|||
void timediff(PerfTime *now, PerfTime *begin, int *sec, int *msec) |
|||
{ |
|||
|
|||
*msec = (int) now->milliseconds - (int) begin->milliseconds; |
|||
*sec = (int) now->seconds - (int) begin->seconds; |
|||
if (*msec < 0) { |
|||
*msec += 1000; |
|||
(*sec)--; |
|||
} |
|||
return; |
|||
|
|||
} |
|||
|
|||
/* |
|||
* How many seconds have elapsed in running time. |
|||
* This is the routine called in IFseconds |
|||
*/ |
|||
|
|||
double |
|||
seconds(void) |
|||
{ |
|||
#ifdef USE_OMP |
|||
// Usage of OpenMP time function |
|||
return(omp_get_wtime() - timebegin.secs); |
|||
#elif defined(HAVE_QUERYPERFORMANCECOUNTER) |
|||
// Windows (MSC and mingw) specific implementation |
|||
LARGE_INTEGER frequency, counter; |
|||
QueryPerformanceFrequency(&frequency); |
|||
QueryPerformanceCounter(&counter); |
|||
return ((double)counter.QuadPart / frequency.QuadPart - timebegin.secs); |
|||
#elif defined(HAVE_CLOCK_GETTIME) |
|||
struct timespec ts; |
|||
clock_gettime(CLOCK_MONOTONIC, &ts); |
|||
return (ts.tv_sec + ts.tv_nsec / 1e9 - timebegin.secs); |
|||
#elif defined(HAVE_GETTIMEOFDAY) |
|||
// Usage of gettimeofday |
|||
struct timeval tv; |
|||
gettimeofday(&tv, NULL); |
|||
return (tv.tv_sec + tv.tv_usec / 1e6 - timebegin.secs); |
|||
#elif defined(HAVE_FTIME) |
|||
// Usage of ftime |
|||
struct timeb tb; |
|||
PerfTime timenow; |
|||
int sec, msec; |
|||
ftime(&tb); |
|||
timenow.seconds = tb.time; |
|||
timenow.milliseconds = tb.millitm; |
|||
timediff(&timenow, &timebegin, &sec, &msec); |
|||
return(sec + (double) msec / 1000.0); |
|||
#elif defined(HAVE_TIMES) |
|||
// Usage of times |
|||
struct tms tmsbuf; |
|||
clock_t ticks = times(&tmsbuf); |
|||
return((double) tmsbuf.tms_utime / HZ); |
|||
#elif defined(HAVE_GETRUSAGE) |
|||
// Usage of getrusage |
|||
struct rusage ruse; |
|||
getrusage(RUSAGE_SELF, &ruse); |
|||
return ((double)ruse.ru_utime.tv_sec + (double) ruse.ru_utime.tv_usec / 1000000.0); |
|||
#else |
|||
#error "No timer function available." |
|||
#endif |
|||
} |
|||
|
|||
void perf_timer_get_time(PerfTime *time) |
|||
{ |
|||
time->secs = seconds(); |
|||
time->seconds = (int)time->secs; |
|||
time->milliseconds = (int)((time->secs - time->seconds) * 1000.0); |
|||
|
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue