X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fsorter%2Fsort-test.c;h=e7d5873020d2bb527e2ac0efb312bbe5ff0b8e4f;hb=91c499892f07ad6494351a1c1985a0d3e2600a25;hp=be6fd511681ec5b12b0bc74fdcb1b0b43934ff52;hpb=e6f42d16d3278e709f23825944598769539368e5;p=libucw.git diff --git a/lib/sorter/sort-test.c b/lib/sorter/sort-test.c index be6fd511..e7d58730 100644 --- a/lib/sorter/sort-test.c +++ b/lib/sorter/sort-test.c @@ -21,9 +21,17 @@ #include #include +/*** A hack for overriding radix-sorter configuration ***/ + +#ifdef FORCE_RADIX_BITS +#undef CONFIG_UCW_RADIX_SORTER_BITS +#define CONFIG_UCW_RADIX_SORTER_BITS FORCE_RADIX_BITS +#endif + /*** Time measurement ***/ static timestamp_t timer; +static uns test_id; static void start(void) @@ -36,7 +44,7 @@ static void stop(void) { sync(); - msg(L_INFO, "Test took %.3fs", get_timer(&timer) / 1000.); + msg(L_INFO, "Test %d took %.3fs", test_id, get_timer(&timer) / 1000.); } /*** Simple 4-byte integer keys ***/ @@ -137,7 +145,7 @@ test_counted(int mode, u64 size) die("Discrepancy: %u instead of %u", j, i); uns k = bgetl(f); if (k != 2*mult) - die("Discrepancy: %u has count %u instead of %u", j, k, mult); + die("Discrepancy: %u has count %u instead of %u", j, k, 2*mult); } bclose(f); } @@ -152,9 +160,10 @@ struct key3 { static inline int s3_compare(struct key3 *x, struct key3 *y) { - /* FIXME: Maybe unroll manually? */ - for (uns i=0; i<4; i++) - COMPARE(x->hash[i], y->hash[i]); + COMPARE(x->hash[0], y->hash[0]); + COMPARE(x->hash[1], y->hash[1]); + COMPARE(x->hash[2], y->hash[2]); + COMPARE(x->hash[3], y->hash[3]); return 0; } @@ -388,7 +397,7 @@ static int s5_gen(struct s5_pair *p) { if (s5_j >= s5_N) { - if (s5_i >= s5_N-1) + if (!s5_N || s5_i >= s5_N-1) return 0; s5_j = 0; s5_i++; @@ -417,7 +426,7 @@ static void s5_write_merged(struct fastbuf *f, struct key5 **keys, void **data, s5m_sort(m, a); keys[0]->cnt = m; bwrite(f, keys[0], sizeof(struct key5)); - bwrite(f, a, 4*m); /* FIXME: Might overflow here */ + bwrite(f, a, 4*m); } static void s5_copy_merged(struct key5 **keys, struct fastbuf **data, uns n, struct fastbuf *dest) @@ -452,13 +461,10 @@ static inline int s5p_lt(struct s5_pair x, struct s5_pair y) return 0; } -/* FIXME: Use smarter internal sorter when it's available */ #define ASORT_PREFIX(x) s5p_##x #define ASORT_KEY_TYPE struct s5_pair -#define ASORT_ELT(i) ary[i] #define ASORT_LT(x,y) s5p_lt(x,y) -#define ASORT_EXTRA_ARGS , struct s5_pair *ary -#include "lib/arraysort.h" +#include "lib/sorter/array.h" static int s5_presort(struct fastbuf *dest, void *buf, size_t bufsize) { @@ -469,7 +475,7 @@ static int s5_presort(struct fastbuf *dest, void *buf, size_t bufsize) n++; if (!n) return 0; - s5p_sort(n, a); + s5p_sort(a, n); uns i = 0; while (i < n) { @@ -514,6 +520,8 @@ test_graph(uns mode, u64 size) uns N = 3; while ((u64)N*(N+2)*4 < size) N = nextprime(N); + if (!size) + N = 0; msg(L_INFO, ">>> Graph%s (N=%u)", (mode ? "" : " with custom presorting"), N); s5_N = N; s5_K = N/4*3; @@ -606,6 +614,7 @@ test_int64(int mode, u64 size) static void run_test(uns i, u64 size) { + test_id = i; switch (i) { case 0: @@ -663,9 +672,20 @@ main(int argc, char **argv) goto usage; break; case 't': - t = atol(optarg); - if (t >= TMAX) - goto usage; + { + char *w[32]; + int f = sepsplit(optarg, ',', w, ARRAY_SIZE(w)); + if (f < 0) + goto usage; + t = 0; + for (int i=0; i= TMAX) + goto usage; + t |= 1 << j; + } + } break; case 'v': sorter_trace++; @@ -678,10 +698,8 @@ main(int argc, char **argv) if (optind != argc) goto usage; - if (t != ~0U) - run_test(t, size); - else - for (uns i=0; i