// drfuchs modification of pantalaimon's original
#include <stdbool.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
#define ARRAY_SIZE 1048576
#define ITERATIONS 1000
int myarray[ARRAY_SIZE+1];
bool search_naive(int key, int len)
{
int *ary = &myarray[0], *end = ary+len;
for (; ary != end; ++ary)
if (*ary == key)
return true;
return false;
}
bool search_knuth(int key, int len)
{
int *ary = &myarray[0], *end = ary+len;
*end = key;
for (; *ary != key; ++ary) { }
return ary != end;
}
static int do_benchmark(bool (*search)(int, int), int key, int len)
{
int found = 0;
struct timespec t[2];
unsigned long time_ns;
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &t[0]);
for (int i = 0; i < ITERATIONS; ++i)
found += search(key, len);
clock_gettime(CLOCK_THREAD_CPUTIME_ID, &t[1]);
time_ns = t[1].tv_nsec-t[0].tv_nsec + 1000000000*(t[1].tv_sec-t[0].tv_sec);
printf("average: %.2f ns\n", (float)time_ns / ITERATIONS);
return found;
}
int main(void)
{
for (int i = 0; i < ARRAY_SIZE; ++i)
myarray[i] = random();
const int siz = ARRAY_SIZE - (random() & 1); // avoid loop unrolling
const int key = random();
int tot = 0;
puts("naive search"); tot += do_benchmark(search_naive, key, siz);
puts("knuth search"); tot += do_benchmark(search_knuth, key, siz);
return tot; // so searches aren't optimized away
}