committed by
Holger Vogt
6 changed files with 179 additions and 185 deletions
-
2src/misc/Makefile.am
-
327src/misc/misc_time.c
-
32src/misc/win_time.c
-
1visualc/sharedspice.vcxproj
-
1visualc/vngspice-fftw.vcxproj
-
1visualc/vngspice.vcxproj
@ -1,148 +1,179 @@ |
|||
/********** |
|||
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) |
|||
#ifdef HAVE_QUERYPERFORMANCECOUNTER |
|||
#define WIN32_LEAN_AND_MEAN |
|||
/* |
|||
* The ngspice.h file included above defines BOOLEAN (via bool.h) and this |
|||
* clashes with the definition obtained from windows.h (via winnt.h). |
|||
* However, BOOLEAN is not used by this file so we can work round this problem |
|||
* by undefining BOOLEAN before including windows.h |
|||
* SJB - April 2005 |
|||
*/ |
|||
#undef BOOLEAN |
|||
#include <windows.h> |
|||
#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(); |
|||
#elif defined(HAVE_QUERYPERFORMANCECOUNTER) |
|||
// Windows (MSC and mingw) specific implementation |
|||
LARGE_INTEGER frequency, counter; |
|||
QueryPerformanceFrequency(&frequency); |
|||
QueryPerformanceCounter(&counter); |
|||
return (double)counter.QuadPart / frequency.QuadPart; |
|||
#elif defined(HAVE_CLOCK_GETTIME) |
|||
struct timespec ts; |
|||
clock_gettime(CLOCK_MONOTONIC, &ts); |
|||
return ts.tv_sec + ts.tv_nsec / 1e9; |
|||
#elif defined(HAVE_GETTIMEOFDAY) |
|||
// Usage of gettimeofday |
|||
struct timeval tv; |
|||
gettimeofday(&tv, NULL); |
|||
return tv.tv_sec + tv.tv_usec / 1e6; |
|||
#elif defined(HAVE_TIMES) |
|||
// Usage of times |
|||
struct tms t; |
|||
clock_t ticks = times(&t); |
|||
return (double)ticks / sysconf(_SC_CLK_TCK); |
|||
#elif defined(HAVE_GETRUSAGE) |
|||
// Usage of getrusage |
|||
struct rusage usage; |
|||
getrusage(RUSAGE_SELF, &usage); |
|||
return usage.ru_utime.tv_sec + usage.ru_utime.tv_usec / 1e6; |
|||
#elif defined(HAVE_FTIME) |
|||
// Usage of ftime |
|||
struct timeb tb; |
|||
ftime(&tb); |
|||
return tb.time + tb.millitm / 1000.0; |
|||
#else |
|||
#error "No timer function available." |
|||
#endif |
|||
} |
|||
|
|||
void perf_timer_start(PerfTimer *timer) |
|||
{ |
|||
timer->start = seconds(); |
|||
} |
|||
|
|||
void perf_timer_stop(PerfTimer *timer) |
|||
{ |
|||
timer->end = seconds(); |
|||
} |
|||
|
|||
void perf_timer_elapsed_sec_ms(const PerfTimer *timer, int *seconds, int *milliseconds) |
|||
{ |
|||
double elapsed = timer->end - timer->start; |
|||
*seconds = (int)elapsed; |
|||
*milliseconds = (int)((elapsed - *seconds) * 1000.0); |
|||
} |
|||
|
|||
void perf_timer_get_time(PerfTime *time) |
|||
{ |
|||
double secs = seconds(); |
|||
time->seconds = (int)secs; |
|||
time->milliseconds = (int)((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) |
|||
#ifdef HAVE_QUERYPERFORMANCECOUNTER |
|||
#define WIN32_LEAN_AND_MEAN |
|||
/* |
|||
* The ngspice.h file included above defines BOOLEAN (via bool.h) and this |
|||
* clashes with the definition obtained from windows.h (via winnt.h). |
|||
* However, BOOLEAN is not used by this file so we can work round this problem |
|||
* by undefining BOOLEAN before including windows.h |
|||
* SJB - April 2005 |
|||
*/ |
|||
#undef BOOLEAN |
|||
#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) |
|||
{ |
|||
// 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 |
|||
#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(); |
|||
#elif defined(HAVE_QUERYPERFORMANCECOUNTER) |
|||
// Windows (MSC and mingw) specific implementation |
|||
LARGE_INTEGER frequency, counter; |
|||
QueryPerformanceFrequency(&frequency); |
|||
QueryPerformanceCounter(&counter); |
|||
return (double)counter.QuadPart / frequency.QuadPart; |
|||
#elif defined(HAVE_CLOCK_GETTIME) |
|||
struct timespec ts; |
|||
clock_gettime(CLOCK_MONOTONIC, &ts); |
|||
return ts.tv_sec + ts.tv_nsec / 1e9; |
|||
#elif defined(HAVE_GETTIMEOFDAY) |
|||
// Usage of gettimeofday |
|||
struct timeval tv; |
|||
gettimeofday(&tv, NULL); |
|||
return tv.tv_sec + tv.tv_usec / 1e6; |
|||
#elif defined(HAVE_TIMES) |
|||
// Usage of times |
|||
struct tms t; |
|||
clock_t ticks = times(&t); |
|||
return (double)ticks / sysconf(_SC_CLK_TCK); |
|||
#elif defined(HAVE_GETRUSAGE) |
|||
// Usage of getrusage |
|||
struct rusage usage; |
|||
getrusage(RUSAGE_SELF, &usage); |
|||
return usage.ru_utime.tv_sec + usage.ru_utime.tv_usec / 1e6; |
|||
#elif defined(HAVE_FTIME) |
|||
// Usage of ftime |
|||
struct timeb tb; |
|||
ftime(&tb); |
|||
return tb.time + tb.millitm / 1000.0; |
|||
#else |
|||
#error "No timer function available." |
|||
#endif |
|||
} |
|||
|
|||
void perf_timer_start(PerfTimer *timer) |
|||
{ |
|||
timer->start = seconds(); |
|||
} |
|||
|
|||
void perf_timer_stop(PerfTimer *timer) |
|||
{ |
|||
timer->end = seconds(); |
|||
} |
|||
|
|||
void perf_timer_elapsed_sec_ms(const PerfTimer *timer, int *seconds, int *milliseconds) |
|||
{ |
|||
double elapsed = timer->end - timer->start; |
|||
*seconds = (int)elapsed; |
|||
*milliseconds = (int)((elapsed - *seconds) * 1000.0); |
|||
} |
|||
|
|||
void perf_timer_get_time(PerfTime *time) |
|||
{ |
|||
double secs = seconds(); |
|||
time->seconds = (int)secs; |
|||
time->milliseconds = (int)((secs - time->seconds) * 1000.0); |
|||
|
|||
} |
|||
@ -1,32 +0,0 @@ |
|||
#define WIN32_LEAN_AND_MEAN |
|||
//#include "ngspice/ngspice.h" |
|||
#include <Windows.h> |
|||
#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) |
|||
{ |
|||
// 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; |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue