X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fsorter%2Fsort-test.c;h=208de918fcc340f44f74c473a2826b22f8f01326;hb=a5ff98a53789157a6c96e58b2385bb898d688a22;hp=8cf1433f8e540b7626462b7541b51c91d6172b01;hpb=969ce845f3bf35bb7423bac705d46196bb863e72;p=libucw.git diff --git a/lib/sorter/sort-test.c b/lib/sorter/sort-test.c index 8cf1433f..208de918 100644 --- a/lib/sorter/sort-test.c +++ b/lib/sorter/sort-test.c @@ -11,6 +11,7 @@ #include "lib/getopt.h" #include "lib/conf.h" #include "lib/fastbuf.h" +#include "lib/ff-binary.h" #include "lib/hashfunc.h" #include "lib/md5.h" @@ -20,20 +21,30 @@ #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) { sync(); - init_timer(); + init_timer(&timer); } static void stop(void) { sync(); - log(L_INFO, "Test took %.3fs", get_timer() / 1000.); + msg(L_INFO, "Test %d took %.3fs", test_id, get_timer(&timer) / 1000.); } /*** Simple 4-byte integer keys ***/ @@ -48,6 +59,7 @@ struct key1 { #define SORT_OUTPUT_FB #define SORT_UNIQUE #define SORT_INT(k) (k).x +#define SORT_DELETE_INPUT 0 #include "lib/sorter/sorter.h" @@ -56,7 +68,7 @@ test_int(int mode, u64 size) { uns N = size ? nextprime(MIN(size/4, 0xffff0000)) : 0; uns K = N/4*3; - log(L_INFO, ">>> Integers (%s, N=%u)", ((char *[]) { "increasing", "decreasing", "random" })[mode], N); + msg(L_INFO, ">>> Integers (%s, N=%u)", ((char *[]) { "increasing", "decreasing", "random" })[mode], N); struct fastbuf *f = bopen_tmp(65536); for (uns i=0; icnt += k[i]->cnt; - bwrite(dest, k[0], sizeof(struct key2)); -} - #define SORT_KEY_REGULAR struct key2 #define SORT_PREFIX(x) s2_##x #define SORT_INPUT_FB @@ -116,7 +121,7 @@ test_counted(int mode, u64 size) mult++; uns N = items ? nextprime(items/(2*mult)) : 0; uns K = N/4*3; - log(L_INFO, ">>> Counted integers (%s, N=%u, mult=%u)", ((char *[]) { "increasing", "decreasing", "random" })[mode], N, mult); + msg(L_INFO, ">>> Counted integers (%s, N=%u, mult=%u)", ((char *[]) { "increasing", "decreasing", "random" })[mode], N, mult); struct fastbuf *f = bopen_tmp(65536); for (uns m=0; mhash[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; } @@ -208,7 +214,7 @@ static void test_hashes(int mode, u64 size) { uns N = MIN(size / sizeof(struct key3), 0xffffffff); - log(L_INFO, ">>> Hashes (%s, N=%u)", ((char *[]) { "increasing", "decreasing", "random" })[mode], N); + msg(L_INFO, ">>> Hashes (%s, N=%u)", ((char *[]) { "increasing", "decreasing", "random" })[mode], N); struct key3 k, lastk; struct fastbuf *f = bopen_tmp(65536); @@ -326,7 +332,7 @@ test_strings(uns mode, u64 size) { uns avg_item_size = KEY4_MAX/2 + 4 + (mode ? 128 : 0); uns N = MIN(size / avg_item_size, 0xffffffff); - log(L_INFO, ">>> Strings %s(N=%u)", (mode ? "with data " : ""), N); + msg(L_INFO, ">>> Strings %s(N=%u)", (mode ? "with data " : ""), N); srand(1); struct key4 k, lastk; @@ -420,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) @@ -455,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) { @@ -472,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) { @@ -491,6 +494,7 @@ static int s5_presort(struct fastbuf *dest, void *buf, size_t bufsize) #define SORT_PREFIX(x) s5_##x #define SORT_DATA_SIZE(k) (4*(k).cnt) #define SORT_UNIFY +#define SORT_UNIFY_WORKSPACE(k) SORT_DATA_SIZE(k) #define SORT_INPUT_PRESORT #define SORT_OUTPUT_THIS_FB #define SORT_INT(k) (k).x @@ -501,6 +505,7 @@ static int s5_presort(struct fastbuf *dest, void *buf, size_t bufsize) #define SORT_PREFIX(x) s5b_##x #define SORT_DATA_SIZE(k) (4*(k).cnt) #define SORT_UNIFY +#define SORT_UNIFY_WORKSPACE(k) SORT_DATA_SIZE(k) #define SORT_INPUT_FB #define SORT_OUTPUT_THIS_FB #define SORT_INT(k) (k).x @@ -515,7 +520,7 @@ test_graph(uns mode, u64 size) uns N = 3; while ((u64)N*(N+2)*4 < size) N = nextprime(N); - log(L_INFO, ">>> Graph%s (N=%u)", (mode ? "" : " with custom presorting"), N); + msg(L_INFO, ">>> Graph%s (N=%u)", (mode ? "" : " with custom presorting"), N); s5_N = N; s5_K = N/4*3; s5_L = N/3*2; @@ -561,11 +566,53 @@ test_graph(uns mode, u64 size) bclose(f); } +/*** Simple 8-byte integer keys ***/ + +struct key6 { + u64 x; +}; + +#define SORT_KEY_REGULAR struct key6 +#define SORT_PREFIX(x) s6_##x +#define SORT_INPUT_FB +#define SORT_OUTPUT_FB +#define SORT_UNIQUE +#define SORT_INT64(k) (k).x + +#include "lib/sorter/sorter.h" + +static void +test_int64(int mode, u64 size) +{ + u64 N = size ? nextprime(MIN(size/8, 0xffff0000)) : 0; + u64 K = N/4*3; + msg(L_INFO, ">>> 64-bit integers (%s, N=%llu)", ((char *[]) { "increasing", "decreasing", "random" })[mode], (long long)N); + + struct fastbuf *f = bopen_tmp(65536); + for (u64 i=0; i= 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++; @@ -632,10 +696,8 @@ main(int argc, char **argv) if (optind != argc) goto usage; - if (t != ~0U) - run_test(t, size); - else - for (uns i=0; i