summaryrefslogtreecommitdiffstats
path: root/test/benchmark.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/benchmark.c')
-rw-r--r--test/benchmark.c183
1 files changed, 183 insertions, 0 deletions
diff --git a/test/benchmark.c b/test/benchmark.c
new file mode 100644
index 0000000..2d7925a
--- /dev/null
+++ b/test/benchmark.c
@@ -0,0 +1,183 @@
+#include "GeoIP.h"
+#include "GeoIPCity.h"
+#include <stdio.h>
+#if !defined(_MSC_VER)
+#include <sys/time.h>
+#endif
+
+char *ipstring[4] = {
+ "24.24.24.24", "80.24.24.80", "200.24.24.40", "68.24.24.46"};
+
+int numipstrings = 4;
+
+#if defined(_WIN32)
+#define DATADIR SRCDIR "/data/"
+#else
+#define DATADIR "/usr/local/share/GeoIP/"
+#endif
+
+#define GEOIP_OPEN(basename, flg) \
+ do { \
+ i = GeoIP_open(DATADIR basename, (flg) | GEOIP_SILENCE); \
+ if (i == NULL) { \
+ printf("error: %s%s does not exist\n", DATADIR, basename); \
+ return; \
+ /* or a 'longjmp(geo_jmp,1)'? */ \
+ } \
+ } while (0)
+
+#if !defined(_WIN32)
+struct timeval timer_t1;
+struct timeval timer_t2;
+#else /* !defined(_WIN32) */
+FILETIME timer_t1; /* 100 ns */
+FILETIME timer_t2;
+#endif /* !defined(_WIN32) */
+
+#if !defined(_WIN32)
+void timerstart(void) { gettimeofday(&timer_t1, NULL); }
+
+double timerstop(void) {
+ int a1 = 0;
+ int a2 = 0;
+ double r = 0;
+ gettimeofday(&timer_t2, NULL);
+ a1 = timer_t2.tv_sec - timer_t1.tv_sec;
+ a2 = timer_t2.tv_usec - timer_t1.tv_usec;
+ if (a1 < 0) {
+ a1 = a1 - 1;
+ a2 = a2 + 1000000;
+ }
+ r = (((double)a1) + (((double)a2) / 1000000));
+ return r;
+}
+#else /* !defined(_WIN32) */
+void timerstart(void) { GetSystemTimeAsFileTime(&timer_t1); }
+
+double timerstop(void) {
+ __int64 delta; /* VC6 can't convert an unsigned int64 to to double */
+ GetSystemTimeAsFileTime(&timer_t2);
+ delta = FILETIME_TO_USEC(timer_t2) - FILETIME_TO_USEC(timer_t1);
+ return ((double)delta) / 1E6;
+}
+#endif /* !defined(_WIN32) */
+
+void testgeoipcountry(int flags, const char *msg, int numlookups) {
+ double t = 0;
+ int i4 = 0;
+ int i2 = 0;
+ GeoIP *i = NULL;
+
+ GEOIP_OPEN("GeoIP.dat", flags);
+ timerstart();
+ for (i2 = 0; i2 < numlookups; i2++) {
+ GeoIP_country_name_by_addr(i, ipstring[i4]);
+ i4 = (i4 + 1) % numipstrings;
+ }
+ t = timerstop();
+ printf("%s\n", msg);
+ printf("%d lookups made in %f seconds \n", numlookups, t);
+ GeoIP_delete(i);
+}
+
+void testgeoiporg(int flags, const char *msg, int numlookups) {
+ GeoIP *i = NULL;
+ int i4 = 0;
+ int i2 = 0;
+ double t = 0;
+
+ GEOIP_OPEN("GeoIPOrg.dat", flags);
+ timerstart();
+ for (i2 = 0; i2 < numlookups; i2++) {
+ free(GeoIP_name_by_addr(i, ipstring[i4]));
+ i4 = (i4 + 1) % numipstrings;
+ }
+ t = timerstop();
+ printf("%s\n", msg);
+ printf("%d lookups made in %f seconds \n", numlookups, t);
+ GeoIP_delete(i);
+}
+
+void testgeoipregion(int flags, const char *msg, int numlookups) {
+ GeoIP *i = NULL;
+ GeoIPRegion *i3 = NULL;
+ int i4 = 0;
+ int i2 = 0;
+ double t = 0;
+
+ GEOIP_OPEN("GeoIPRegion.dat", flags);
+ timerstart();
+ for (i2 = 0; i2 < numlookups; i2++) {
+ i3 = GeoIP_region_by_addr(i, ipstring[i4]);
+ GeoIPRegion_delete(i3);
+ i4 = (i4 + 1) % numipstrings;
+ }
+ t = timerstop();
+ printf("%s\n", msg);
+ printf("%d lookups made in %f seconds \n", numlookups, t);
+ GeoIP_delete(i);
+}
+
+void testgeoipcity(int flags, const char *msg, int numlookups) {
+ GeoIP *i = NULL;
+ GeoIPRecord *i3 = NULL;
+ int i4 = 0;
+ int i2 = 0;
+ double t = 0;
+
+ GEOIP_OPEN("GeoLiteCity.dat", flags);
+ timerstart();
+ for (i2 = 0; i2 < numlookups; i2++) {
+ i3 = GeoIP_record_by_addr(i, ipstring[i4]);
+ GeoIPRecord_delete(i3);
+ i4 = (i4 + 1) % numipstrings;
+ }
+ t = timerstop();
+ printf("%s\n", msg);
+ printf("%d lookups made in %f seconds \n", numlookups, t);
+ GeoIP_delete(i);
+}
+
+int main(void) {
+ int time = 300 * numipstrings;
+ testgeoipcountry(0, "GeoIP Country", 100 * time);
+ testgeoipcountry(
+ GEOIP_CHECK_CACHE, "GeoIP Country with GEOIP_CHECK_CACHE", 100 * time);
+ testgeoipcountry(GEOIP_MEMORY_CACHE,
+ "GeoIP Country with GEOIP_MEMORY_CACHE",
+ 1000 * time);
+ testgeoipcountry(
+ GEOIP_MEMORY_CACHE | GEOIP_CHECK_CACHE,
+ "GeoIP Country with GEOIP_MEMORY_CACHE and GEOIP_CHECK_CACHE",
+ 1000 * time);
+
+ testgeoipregion(0, "GeoIP Region", 100 * time);
+ testgeoipregion(
+ GEOIP_CHECK_CACHE, "GeoIP Region with GEOIP_CHECK_CACHE", 100 * time);
+ testgeoipregion(GEOIP_MEMORY_CACHE,
+ "GeoIP Region with GEOIP_MEMORY_CACHE",
+ 1000 * time);
+ testgeoipregion(
+ GEOIP_MEMORY_CACHE | GEOIP_CHECK_CACHE,
+ "GeoIP Region with GEOIP_MEMORY_CACHE and GEOIP_CHECK_CACHE",
+ 1000 * time);
+
+ testgeoiporg(0, "GeoIP Org", 50 * time);
+ testgeoiporg(
+ GEOIP_INDEX_CACHE, "GeoIP Org with GEOIP_INDEX_CACHE", 200 * time);
+ testgeoiporg(GEOIP_INDEX_CACHE | GEOIP_CHECK_CACHE,
+ "GeoIP Org with GEOIP_INDEX_CACHE and GEOIP_CHECK_CACHE",
+ 200 * time);
+ testgeoiporg(
+ GEOIP_MEMORY_CACHE, "GeoIP Org with GEOIP_MEMORY_CACHE", 500 * time);
+
+ testgeoipcity(0, "GeoIP City", 50 * time);
+ testgeoipcity(
+ GEOIP_INDEX_CACHE, "GeoIP City with GEOIP_INDEX_CACHE", 200 * time);
+ testgeoipcity(GEOIP_INDEX_CACHE | GEOIP_CHECK_CACHE,
+ "GeoIP City with GEOIP_INDEX_CACHE and GEOIP_CHECK_CACHE",
+ 200 * time);
+ testgeoipcity(
+ GEOIP_MEMORY_CACHE, "GeoIP City with GEOIP_MEMORY_CACHE", 500 * time);
+ return 0;
+}