5 /* For doing time calculations */
8 #include <sys/resource.h>
10 static float subtractTimeval(struct timeval value1
, struct timeval value2
)
12 long time1
= value1
.tv_sec
* 1000000 + value1
.tv_usec
;
13 long time2
= value2
.tv_sec
* 1000000 + value2
.tv_usec
;
14 return (float)(time1
- time2
) / 1000000;
17 static float subtractTimeSpec(struct timespec value1
, struct timespec value2
)
19 long time1
= value1
.tv_sec
* 1000000000 + value1
.tv_nsec
;
20 long time2
= value2
.tv_sec
* 1000000000 + value2
.tv_nsec
;
21 return (float)(time1
- time2
) / 1000000000;
24 /* reverse 'arr', which has 'narr' elements */
25 static void reverse(FvsMinutiaSet_t
*arr
, size_t narr
)
29 for (i
=0; i
< narr
/ 2; ++i
) {
30 FvsMinutiaSet_t
*tmp
= arr
[i
];
31 arr
[i
] = arr
[narr
-i
-1];
36 /* rotate 'arr' of size 'narr' by 'shift' */
37 static void rotate(FvsMinutiaSet_t
*arr
, size_t narr
, unsigned long shift
)
40 reverse(arr
+ shift
, narr
- shift
);
44 static int compareFloats(float a
, float b
)
46 float diff
= fmaxf(a
, b
) - fminf(a
, b
);
53 int main(int argc
, const char *argv
[])
55 int numberOfFiles
= argc
- 1;
56 const char **testFiles
= argv
+ 1;
57 float *expectedResults
= (float*)malloc(numberOfFiles
* sizeof(float));
58 struct timespec time1
, time2
;
59 struct rusage usage1
, usage2
;
60 float elaspedTime
, cpuTime
, averageWallTime
;
63 /* check if all parameters are there */
66 printf("Usage:\n %s image1 image2...\n", argv
[0]);
69 memset(expectedResults
, 0, numberOfFiles
);
70 expectedResults
[0] = 1;
71 FvsMinutiaSet_t
*minutiaArray
= loadMinutiaSetsFromFiles(numberOfFiles
, testFiles
);
73 getrusage(RUSAGE_SELF
, &usage1
);
74 clock_gettime(CLOCK_MONOTONIC_RAW
, &time1
);
76 for (int j
= 0; j
< numberOfFiles
; ++j
)
78 results
= compareMinutiaSets(numberOfFiles
, minutiaArray
);
79 for (int i
= 0; i
< numberOfFiles
; ++i
)
80 if (!compareFloats(expectedResults
[i
], results
[i
]))
81 printf("ERROR: %d %d %s %s %.2f %.2f\n", j
, i
, testFiles
[0], testFiles
[i
], expectedResults
[i
], results
[i
]);
83 rotate(minutiaArray
, numberOfFiles
, 1);
86 getrusage(RUSAGE_SELF
, &usage2
);
87 clock_gettime(CLOCK_MONOTONIC_RAW
, &time2
);
89 elaspedTime
= subtractTimeSpec(time2
, time1
);
90 averageWallTime
= elaspedTime
/ numberOfFiles
;
91 cpuTime
= subtractTimeval(usage2
.ru_utime
, usage1
.ru_utime
);
92 printf("Compare %d files : %02.3fsec = %02.3fsec/file, cpu time: %02.3fsec, speedup: %02.2fx\n",
93 numberOfFiles
, elaspedTime
, averageWallTime
, cpuTime
, cpuTime
/ elaspedTime
);
95 cleanupMinutiaSetArray(numberOfFiles
, minutiaArray
);
96 free(expectedResults
);