]> mj.ucw.cz Git - libucw.git/blobdiff - lib/sorter/s-internal.h
Made radix-sorting threshold configurable and let radix-tune-bits
[libucw.git] / lib / sorter / s-internal.h
index a2f9e06bc27fd2bcf337dd48b9429c6e97e1dd0f..ef2da2402958cfa62bfdac3a69d575390ce7e0a8 100644 (file)
@@ -172,11 +172,9 @@ static int P(internal)(struct sort_context *ctx, struct sort_bucket *bin, struct
        stk_fsize((byte*)ctx->big_buf + bufsize - end));
   timestamp_t timer;
   init_timer(&timer);
-  item_array = P(array_sort)(item_array, count,
+  item_array = P(array_sort)(item_array, count
 #ifdef SORT_INTERNAL_RADIX
-    workspace, bin->hash_bits
-#else
-    NULL, 0
+    , workspace, bin->hash_bits
 #endif
     );
   ctx->total_int_time += get_timer(&timer);
@@ -228,17 +226,24 @@ static int P(internal)(struct sort_context *ctx, struct sort_bucket *bin, struct
 static u64
 P(internal_estimate)(struct sort_context *ctx, struct sort_bucket *b UNUSED)
 {
+  // Most of this is just wild guesses
 #ifdef SORT_VAR_KEY
-  uns avg = ALIGN_TO(sizeof(P(key))/4, CPU_STRUCT_ALIGN);      // Wild guess...
+  uns avg = ALIGN_TO(sizeof(P(key))/4, CPU_STRUCT_ALIGN);
 #else
   uns avg = ALIGN_TO(sizeof(P(key)), CPU_STRUCT_ALIGN);
 #endif
-  // We ignore the data part of records, it probably won't make the estimate much worse
-  size_t bufsize = ctx->big_buf_size;
-#ifdef SORT_UNIFY_WORKSPACE            // FIXME: Or if radix-sorting
-  bufsize /= 2;
+  uns ws = 0;
+#ifdef SORT_UNIFY
+  ws += sizeof(void *);
 #endif
-  return (bufsize / (avg + sizeof(P(internal_item_t))) * avg);
+#ifdef SORT_UNIFY_WORKSPACE
+  ws += avg;
+#endif
+#ifdef SORT_INTERNAL_RADIX
+  ws = MAX(ws, sizeof(P(internal_item_t)));
+#endif
+  // We ignore the data part of records, it probably won't make the estimate much worse
+  return (ctx->big_buf_size / (avg + ws + sizeof(P(internal_item_t))) * avg);
 }
 
 #undef SORT_COPY_HASH