Actual source code: nt_time.c
1: /*$Id: nt_time.c,v 1.25 2001/04/05 21:06:51 balay Exp $*/
3: #include <petsc.h>
4: #if defined (PARCH_win32_gnu) || defined (PARCH_win32)
5: #include <Windows.h>
6: #define FACTOR 4294967296.0 /* pow(2,32) */
8: PetscLogDouble nt_time(void)
9: {
10: static PetscTruth flag = PETSC_TRUE;
11: int ierr;
13: static LARGE_INTEGER StartTime,PerfFreq,CurTime;
14: static PetscLogDouble SecInTick=0.0;
15:
16: DWORD dwStartHigh,dwCurHigh;
17: PetscLogDouble dTime,dHigh;
18: PetscLogDouble ptime;
19:
20:
22: if (flag) {
23: QueryPerformanceCounter(&StartTime);CHKERRQ(!ierr);
24: QueryPerformanceFrequency(&PerfFreq);CHKERRQ(!ierr);
25: /* Explicitly convert the higher 32 bits, and add the lower 32 bits from the counter */
26: /* works on non-pentium CPUs ? */
27: SecInTick = 1.0/((double)PerfFreq.HighPart*FACTOR+(double)PerfFreq.LowPart);
28: flag = PETSC_FALSE;
29: }
30:
31: ierr = QueryPerformanceCounter(&CurTime);CHKERRQ(!ierr);
32: dwCurHigh = (DWORD)CurTime.HighPart;
33: dwStartHigh = (DWORD)StartTime.HighPart;
34: dHigh = (signed)(dwCurHigh - dwStartHigh);
36: dTime = dHigh*(double)FACTOR + (double)CurTime.LowPart - (double)StartTime.LowPart;
37: /* Use the following with older versions of the Borland compiler
38: dTime = dHigh*(double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart;
39: */
40: ptime = (double)SecInTick*dTime;
42: PetscFunctionReturn(ptime);
43: }
44: #endif