Actual source code: nt_time.c
1: #define PETSC_DLL
3: #include <petscsys.h>
4: #include <Windows.h>
5: #define FACTOR 4294967296.0 /* pow(2,32) */
11: PetscLogDouble nt_time(void)
12: {
13: static PetscTruth flag = PETSC_TRUE;
16: static LARGE_INTEGER StartTime,PerfFreq,CurTime;
17: static PetscLogDouble SecInTick=0.0;
18:
19: DWORD dwStartHigh,dwCurHigh;
20: PetscLogDouble dTime,dHigh;
21: PetscLogDouble ptime;
22:
23:
25: if (flag) {
26: QueryPerformanceCounter(&StartTime);CHKERRQ(!ierr);
27: QueryPerformanceFrequency(&PerfFreq);CHKERRQ(!ierr);
28: /* Explicitly convert the higher 32 bits, and add the lower 32 bits from the counter */
29: /* works on non-pentium CPUs ? */
30: #if defined(PETSC_HAVE_LARGE_INTEGER_U)
31: SecInTick = 1.0/((double)PerfFreq.u.HighPart*FACTOR+(double)PerfFreq.u.LowPart);
32: #else
33: SecInTick = 1.0/((double)PerfFreq.HighPart*FACTOR+(double)PerfFreq.LowPart);
34: #endif
35: flag = PETSC_FALSE;
36: }
37:
38: QueryPerformanceCounter(&CurTime);CHKERRQ(!ierr);
39: #if defined(PETSC_HAVE_LARGE_INTEGER_U)
40: dwCurHigh = (DWORD)CurTime.u.HighPart;
41: dwStartHigh = (DWORD)StartTime.u.HighPart;
42: #else
43: dwCurHigh = (DWORD)CurTime.HighPart;
44: dwStartHigh = (DWORD)StartTime.HighPart;
45: #endif
46: dHigh = (signed)(dwCurHigh - dwStartHigh);
48: #if defined(PETSC_HAVE_LARGE_INTEGER_U)
49: dTime = dHigh*(double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart;
50: #else
51: dTime = dHigh*(double)FACTOR + (double)CurTime.LowPart - (double)StartTime.LowPart;
52: #endif
53: /* Use the following with older versions of the Borland compiler
54: dTime = dHigh*(double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart;
55: */
56: ptime = (double)SecInTick*dTime;
58: PetscFunctionReturn(ptime);
59: }