static void info(HXFILE * hp) { HXSTAT st; hxstat(hp, &st); unsigned dpages = _hxf2d(st.npages); unsigned overs = st.npages - dpages - 1; if (!overs) overs = 1; printf("recs=%.0f hash=%08X used=%.0f pages=%.0f ovfl_used=%.0f%%" " load=%.0f,%.0f%% pgsize=%d", st.nrecs, (unsigned)st.hash, st.head_bytes + st.ovfl_bytes, st.npages, st.ovfl_pages * 100 / overs, st.head_bytes * 100 / DATASIZE(hp) / dpages, st.ovfl_bytes * 100 / DATASIZE(hp) / st.ovfl_pages, hp->pgsize); if (hp->uleng) printf(" udata[%d]=%.*s", hp->uleng, hp->uleng, hp->udata); putchar('\n'); }
int main(void) { char input[999]; char const *envhx = getenv("hx"); if (!envhx) die(": $hx not set"); setvbuf(stdout, 0, _IOLBF, 0); plan_tests(1 + 4*4); HXRET rc = hxbuild(0, 0, 1<<20, 0.0); ok(rc == HXERR_BAD_REQUEST, "hxbuild rejects NULL arg: %s", hxerror(rc)); try("/dev/null", 0); try(strcat(strcpy(input, envhx), "/data.tab"), 88172); try(strcat(strcat(strcpy(input, "cat "), envhx), "/data.tab"), 88172); try(strcat(strcat(strcpy(input, "head -2335 "), envhx), "/data.tab"), 2335); return exit_status(); } static void try(char const *inpfile, int nrecs) { FILE *fp = strchr(inpfile, ' ') ? popen(inpfile, "r") : fopen(inpfile, "r"); ok(fp, "input %s", inpfile); if (!fp) die(": unable to open %s:", inpfile); setvbuf(fp, NULL, _IOFBF, 16384); hxcreate("build_t.hx", 0755, 4096, "", 0); HXFILE *hp = hxopen("build_t.hx", HX_UPDATE); double alpha = tick(); HXRET rc = hxbuild(hp, fp, 1<<20, 0.0); //128MB double omega = tick(); if (strchr(inpfile, ' ')) pclose(fp); else fclose(fp); ok(rc == 0, "hxbuild from (%s) in %.3g secs, returns %s", inpfile, omega - alpha, hxerror(rc)); rc = hxfix(hp,0,0,0,0); ok(rc == (HXRET)HX_UPDATE, "hxcheck returns: %s", hxmode(rc)); HXSTAT st; hxstat(hp, &st); ok(st.nrecs == nrecs, "hxbuild loaded %.0f/%d records", st.nrecs, nrecs); hxclose(hp); unlink("build_t.hx"); }
static void stats(HXFILE * hp) { HXSTAT st; int i, n; hxstat(hp, &st); printf("shape: %.2f", st.avg_fail_pages - 1); printf(" Chains:"); for (n = HX_MAX_CHAIN; !st.chain_hist[n]; --n); for (i = 0; i <= n; ++i) printf(" %d", st.chain_hist[i]); printf(" Shares:"); for (n = HX_MAX_SHARE; !st.share_hist[n]; --n); for (i = 0; i <= n; ++i) printf(" %d", st.share_hist[i]); putchar('\n'); }
int main(int argc, char **argv) { char const *hx = getenv("hx"); if (!hx) hx = "."; int mapmode = HX_MMAP; char inpdflt[strlen(hx) + sizeof "/data.tab"]; char const *inpfile = inpdflt; int memsize = 0; strcat(strcpy(inpdflt, hx), "/data.tab"); if (argc == 1) usage("[-d] inpfile [membits | 0]\n" " -d: use disk io, not mmap\n" " membits: size of RAM for hxbuild (default:20)\n" " membits=0 means use the existing perf_x.hx"); if (!strcmp(argv[1], "-d")) mapmode = 0, ++argv, --argc; switch (argc) { case 3: memsize = atoi(argv[2]); case 2: inpfile = argv[1]; case 1: break; } // Ensure that dirname(argv[0]) is in LD_LIBRARY_PATH: char *dir = strrchr(argv[0], '/'), empty[] = ""; char const *llp = getenv("LD_LIBRARY_PATH"); dir = dir ? (*dir = 0, argv[0]) : empty; if (!llp) llp = ""; char llpath[strlen(dir) + strlen(llp) + 2]; setenv("LD_LIBRARY_PATH", strcat(strcat(strcpy(llpath, dir), ":"), llp), /*OVERRIDE*/1); HXFILE *hp; HXSTAT info; HXRET rc; FILE *fp = strcmp(inpfile, "-") ? fopen(inpfile, "r") : stdin; if (!fp) die(": cannot read %s:", inpfile); setvbuf(fp, NULL, _IOFBF, 65536); if (memsize) { memsize = 1 << memsize; hxcreate("perf_x.hx", 0644, 4096, 0, 0); hp = hxopen("perf_x.hx", HX_UPDATE); rc = hxbuild(hp, fp, memsize, 0.0); if (rc < 0) die("hxbuild(%d): %s", memsize, hxerror(rc)); hxclose(hp); } if (hxdebug) system("echo;echo built; chx info perf_x.hx; chx stat perf_x.hx; chx -vdd check perf_x.hx"); hp = hxopen("perf_x.hx", HX_UPDATE | mapmode); if (!hp) die("cannot open perf_x.hx%s:", mapmode ? " with MMAP" : ""); char buf[4096], rec[4096]; int len; double t0 = tick(); rewind(fp); while (fgets(buf, sizeof(buf), fp)) { buf[strlen(buf) - 1] = 0; hx_load(hp, rec, sizeof rec, buf); hxget(hp, rec, sizeof(rec)); } t0 = tick() - t0; double t1 = tick(); rewind(fp); while (fgets(buf, sizeof(buf), fp)) { buf[strlen(buf) - 1] = 0; buf[0] ^= 0x55; hx_load(hp, rec, sizeof rec, buf); hxget(hp, rec, sizeof(rec)); } t1 = tick() - t1; double t2 = tick(); rewind(fp); while (fgets(buf, sizeof(buf), fp)) { buf[strlen(buf) - 1] = 0; strcat(buf, "hello, world"); len = hx_load(hp, rec, sizeof rec, buf); hxput(hp, rec, len); } t2 = tick() - t2; if (hxdebug) system("echo;echo put+12; chx info perf_x.hx; chx stat perf_x.hx; chx -vdd check perf_x.hx"); double t3 = tick(); rewind(fp); while (fgets(buf, sizeof(buf), fp)) { buf[strlen(buf) - 1] = 0; len = hx_load(hp, rec, sizeof rec, buf); hxput(hp, rec, len); } t3 = tick() - t3; if (hxdebug) system("echo;echo put-0; chx info perf_x.hx; chx stat perf_x.hx; chx -vdd check perf_x.hx"); double t4 = tick(); rewind(fp); while (fgets(buf, sizeof(buf), fp)) { strcpy(buf + strlen(buf) - 1, "---------1---------2---------3---------4---------5---------6---------7---------8---------9---------0\n"); len = hx_load(hp, rec, sizeof rec, buf); hxput(hp, rec, len); } t4 = tick() - t4; if (hxdebug) system("echo;echo put+100; chx info perf_x.hx; chx stat perf_x.hx; chx -vdd check perf_x.hx"); double t5 = tick(); rewind(fp); while (fgets(buf, sizeof(buf), fp)) { buf[strlen(buf) - 1] = 0; hx_load(hp, rec, sizeof rec, buf); hxget(hp, rec, sizeof(rec)); } t5 = tick() - t5; double t6 = tick(); rewind(fp); while (fgets(buf, sizeof(buf), fp)) { buf[strlen(buf) - 1] = 0; buf[0] ^= 0x55; hx_load(hp, rec, sizeof rec, buf); hxget(hp, rec, sizeof(rec)); } t6 = tick() - t6; double t7 = tick(); rewind(fp); while (fgets(buf, sizeof(buf), fp)) { buf[strlen(buf) - 1] = 0; buf[0] ^= 0x55; hx_load(hp, rec, sizeof rec, buf); hxput(hp, rec, sizeof(rec)); } t7 = tick() - t7; hxstat(hp, &info); fprintf(stderr, "nrecs: %g build: %.2fM rec/sec\n(usec:)\n" "\tget-y\t%.2f\n\tget-n\t%.2f\n" "\tput+12\t%.2f\n\tput+0\t%.2f\n\tput+100\t%.2f\n" "\tget-y\t%.2f\n\tget-n\t%.2f\n\tput-xx\t%.2f\n", info.nrecs, info.nrecs/1E6/t0, t0*1E6/info.nrecs, t1*1E6/info.nrecs, t2*1E6/info.nrecs, t3*1E6/info.nrecs, t4*1E6/info.nrecs, t5*1E6/info.nrecs, t6*1E6/info.nrecs, t7*1E6/info.nrecs); return 0; }