diff --git a/lib/common/huf.h b/lib/common/huf.h index 2f2bf4b7..a3ae06e4 100644 --- a/lib/common/huf.h +++ b/lib/common/huf.h @@ -90,7 +90,7 @@ HUF_PUBLIC_API size_t HUF_compress2 (void* dst, size_t dstCapacity, /** HUF_compress4X_wksp() : * Same as HUF_compress2(), but uses externally allocated `workSpace`. * `workspace` must be at least as large as HUF_WORKSPACE_SIZE */ -#define HUF_WORKSPACE_SIZE ((8 << 10) + 256) +#define HUF_WORKSPACE_SIZE ((8 << 10) + 512 /* sorting scratch space */) #define HUF_WORKSPACE_SIZE_U64 (HUF_WORKSPACE_SIZE / sizeof(U64)) HUF_PUBLIC_API size_t HUF_compress4X_wksp (void* dst, size_t dstCapacity, const void* src, size_t srcSize, diff --git a/lib/compress/huf_compress.c b/lib/compress/huf_compress.c index 8529a4b0..67b7ef95 100644 --- a/lib/compress/huf_compress.c +++ b/lib/compress/huf_compress.c @@ -428,22 +428,122 @@ static U32 HUF_setMaxHeight(nodeElt* huffNode, U32 lastNonNull, U32 maxNbBits) } typedef struct { - U32 base; - U32 curr; + U16 base; + U16 curr; } rankPos; typedef nodeElt huffNodeTable[HUF_CTABLE_WORKSPACE_SIZE_U32]; -#define RANK_POSITION_TABLE_SIZE 32 +/* Number of buckets available for HUF_sort() */ +#define RANK_POSITION_TABLE_SIZE 128 typedef struct { huffNodeTable huffNodeTbl; rankPos rankPosition[RANK_POSITION_TABLE_SIZE]; } HUF_buildCTable_wksp_tables; +/* RANK_POSITION_DISTINCT_COUNT_CUTOFF == Cutoff point in HUF_sort() buckets for which we use log2 bucketing. + * Strategy is to use as many buckets as possible for representing distinct + * counts while using the remainder to represent all counts up to HUF_BLOCKSIZE_MAX + * using log2 bucketing. + * + * To satisfy this requirement for 128 buckets, we can do the following: + * Let buckets 0-114 represent distinct counts of [0, 114] + * Let buckets 115 to 126 represent counts of [115, HUF_BLOCKSIZE_MAX]. (the final bucket 127 must remain empty) + * + * Note that we don't actually need 17 buckets (assuming 2^17 maxcount) for log2 bucketing since + * the first few buckets in the log2 bucketing representation are already covered by the distinct count bucketing. + */ +#define RANK_POSITION_LOG_BUCKETS_BEGIN (RANK_POSITION_TABLE_SIZE - 1) - BIT_highbit32(HUF_BLOCKSIZE_MAX) - 1 +#define RANK_POSITION_DISTINCT_COUNT_CUTOFF RANK_POSITION_LOG_BUCKETS_BEGIN + BIT_highbit32(RANK_POSITION_LOG_BUCKETS_BEGIN) + +/* Return the appropriate bucket index for a given count. See definition of + * RANK_POSITION_DISTINCT_COUNT_CUTOFF for explanation of bucketing strategy. + */ +static U32 HUF_getIndex(U32 const count) { + return (count < RANK_POSITION_DISTINCT_COUNT_CUTOFF) + ? count + : BIT_highbit32(count) + RANK_POSITION_LOG_BUCKETS_BEGIN; +} + +/* Helper swap function for HUF_quickSortPartition() */ +static void HUF_swapNodes(nodeElt* a, nodeElt* b) { + nodeElt tmp = *a; + *a = *b; + *b = tmp; +} + +/* Returns 0 if the huffNode array is not sorted by descending count */ +UNUSED_ATTR +static int HUF_isSorted(nodeElt huffNode[], U32 const maxSymbolValue1) { + U32 i; + for (i = 1; i < maxSymbolValue1; ++i) { + if (huffNode[i].count > huffNode[i-1].count) { + return 0; + } + } + return 1; +} + +/* Insertion sort by descending order */ +HINT_INLINE void HUF_insertionSort(nodeElt huffNode[], int const low, int const high) { + int i; + int const size = high-low+1; + huffNode += low; + for (i = 1; i < size; ++i) { + nodeElt const key = huffNode[i]; + int j = i - 1; + while (j >= 0 && huffNode[j].count < key.count) { + huffNode[j + 1] = huffNode[j]; + j--; + } + huffNode[j + 1] = key; + } +} + +/* Pivot helper function for quicksort. */ +static int HUF_quickSortPartition(nodeElt arr[], int const low, int const high) { + /* Simply select rightmost element as pivot. "Better" selectors like + * median-of-three don't experimentally appear to have any benefit. + */ + U32 const pivot = arr[high].count; + int i = low - 1; + int j = low; + for ( ; j < high; j++) { + if (arr[j].count > pivot) { + i++; + HUF_swapNodes(&arr[i], &arr[j]); + } + } + HUF_swapNodes(&arr[i + 1], &arr[high]); + return i + 1; +} + +/* Classic quicksort by descending with partially iterative calls + * to reduce worst case callstack size. + */ +static void HUF_simpleQuickSort(nodeElt arr[], int low, int high) { + int const kInsertionSortThreshold = 8; + if (high - low < kInsertionSortThreshold) { + HUF_insertionSort(arr, low, high); + return; + } + while (low < high) { + int const idx = HUF_quickSortPartition(arr, low, high); + if (idx - low < high - idx) { + HUF_simpleQuickSort(arr, low, idx - 1); + low = idx + 1; + } else { + HUF_simpleQuickSort(arr, idx + 1, high); + high = idx - 1; + } + } +} + /** * HUF_sort(): * Sorts the symbols [0, maxSymbolValue] by count[symbol] in decreasing order. + * This is a typical bucket sorting strategy that uses either quicksort or insertion sort to sort each bucket. * * @param[out] huffNode Sorted symbols by decreasing count. Only members `.count` and `.byte` are filled. * Must have (maxSymbolValue + 1) entries. @@ -451,44 +551,52 @@ typedef struct { * @param[in] maxSymbolValue Maximum symbol value. * @param rankPosition This is a scratch workspace. Must have RANK_POSITION_TABLE_SIZE entries. */ -static void HUF_sort(nodeElt* huffNode, const unsigned* count, U32 maxSymbolValue, rankPos* rankPosition) -{ - int n; - int const maxSymbolValue1 = (int)maxSymbolValue + 1; +static void HUF_sort(nodeElt huffNode[], const unsigned count[], U32 const maxSymbolValue, rankPos rankPosition[]) { + U32 n; + U32 const maxSymbolValue1 = maxSymbolValue+1; /* Compute base and set curr to base. - * For symbol s let lowerRank = BIT_highbit32(count[n]+1) and rank = lowerRank + 1. - * Then 2^lowerRank <= count[n]+1 <= 2^rank. + * For symbol s let lowerRank = HUF_getIndex(count[n]) and rank = lowerRank + 1. + * See HUF_getIndex to see bucketing strategy. * We attribute each symbol to lowerRank's base value, because we want to know where * each rank begins in the output, so for rank R we want to count ranks R+1 and above. */ ZSTD_memset(rankPosition, 0, sizeof(*rankPosition) * RANK_POSITION_TABLE_SIZE); for (n = 0; n < maxSymbolValue1; ++n) { - U32 lowerRank = BIT_highbit32(count[n] + 1); + U32 lowerRank = HUF_getIndex(count[n]); + assert(lowerRank < RANK_POSITION_TABLE_SIZE - 1); rankPosition[lowerRank].base++; } + assert(rankPosition[RANK_POSITION_TABLE_SIZE - 1].base == 0); + /* Set up the rankPosition table */ for (n = RANK_POSITION_TABLE_SIZE - 1; n > 0; --n) { rankPosition[n-1].base += rankPosition[n].base; rankPosition[n-1].curr = rankPosition[n-1].base; } - /* Sort */ + + /* Insert each symbol into their appropriate bucket, setting up rankPosition table. */ for (n = 0; n < maxSymbolValue1; ++n) { U32 const c = count[n]; - U32 const r = BIT_highbit32(c+1) + 1; - U32 pos = rankPosition[r].curr++; - /* Insert into the correct position in the rank. - * We have at most 256 symbols, so this insertion should be fine. - */ - while ((pos > rankPosition[r].base) && (c > huffNode[pos-1].count)) { - huffNode[pos] = huffNode[pos-1]; - pos--; - } + U32 const r = HUF_getIndex(c) + 1; + U32 const pos = rankPosition[r].curr++; + assert(pos < maxSymbolValue1); huffNode[pos].count = c; huffNode[pos].byte = (BYTE)n; } -} + /* Sort each bucket. */ + for (n = RANK_POSITION_DISTINCT_COUNT_CUTOFF; n < RANK_POSITION_TABLE_SIZE - 1; ++n) { + U32 const bucketSize = rankPosition[n].curr-rankPosition[n].base; + U32 const bucketStartIdx = rankPosition[n].base; + if (bucketSize > 1) { + assert(bucketStartIdx < maxSymbolValue1); + HUF_simpleQuickSort(huffNode + bucketStartIdx, 0, bucketSize-1); + } + } + + assert(HUF_isSorted(huffNode, maxSymbolValue1)); +} /** HUF_buildCTable_wksp() : * Same as HUF_buildCTable(), but using externally allocated scratch buffer. diff --git a/tests/regression/results.csv b/tests/regression/results.csv index 0734a539..855401ac 100644 --- a/tests/regression/results.csv +++ b/tests/regression/results.csv @@ -2,19 +2,19 @@ Data, Config, Method, silesia.tar, level -5, compress simple, 6738593 silesia.tar, level -3, compress simple, 6446372 silesia.tar, level -1, compress simple, 6186042 -silesia.tar, level 0, compress simple, 4861425 +silesia.tar, level 0, compress simple, 4861423 silesia.tar, level 1, compress simple, 5334885 -silesia.tar, level 3, compress simple, 4861425 -silesia.tar, level 4, compress simple, 4799630 +silesia.tar, level 3, compress simple, 4861423 +silesia.tar, level 4, compress simple, 4799632 silesia.tar, level 5, compress simple, 4719256 -silesia.tar, level 6, compress simple, 4677721 -silesia.tar, level 7, compress simple, 4613541 +silesia.tar, level 6, compress simple, 4677724 +silesia.tar, level 7, compress simple, 4613545 silesia.tar, level 9, compress simple, 4555426 -silesia.tar, level 13, compress simple, 4491764 +silesia.tar, level 13, compress simple, 4491768 silesia.tar, level 16, compress simple, 4356834 -silesia.tar, level 19, compress simple, 4264392 -silesia.tar, uncompressed literals, compress simple, 4861425 -silesia.tar, uncompressed literals optimal, compress simple, 4264392 +silesia.tar, level 19, compress simple, 4264388 +silesia.tar, uncompressed literals, compress simple, 4861423 +silesia.tar, uncompressed literals optimal, compress simple, 4264388 silesia.tar, huffman literals, compress simple, 6186042 github.tar, level -5, compress simple, 46856 github.tar, level -3, compress simple, 43754 @@ -36,28 +36,28 @@ github.tar, huffman literals, compress silesia, level -5, compress cctx, 6737607 silesia, level -3, compress cctx, 6444677 silesia, level -1, compress cctx, 6178460 -silesia, level 0, compress cctx, 4849552 -silesia, level 1, compress cctx, 5313204 -silesia, level 3, compress cctx, 4849552 -silesia, level 4, compress cctx, 4786970 -silesia, level 5, compress cctx, 4707794 +silesia, level 0, compress cctx, 4849551 +silesia, level 1, compress cctx, 5313202 +silesia, level 3, compress cctx, 4849551 +silesia, level 4, compress cctx, 4786969 +silesia, level 5, compress cctx, 4707790 silesia, level 6, compress cctx, 4666383 silesia, level 7, compress cctx, 4603381 -silesia, level 9, compress cctx, 4546001 -silesia, level 13, compress cctx, 4482135 +silesia, level 9, compress cctx, 4546005 +silesia, level 13, compress cctx, 4482131 silesia, level 16, compress cctx, 4360251 -silesia, level 19, compress cctx, 4283237 -silesia, long distance mode, compress cctx, 4849552 -silesia, multithreaded, compress cctx, 4849552 -silesia, multithreaded long distance mode, compress cctx, 4849552 +silesia, level 19, compress cctx, 4283236 +silesia, long distance mode, compress cctx, 4849551 +silesia, multithreaded, compress cctx, 4849551 +silesia, multithreaded long distance mode, compress cctx, 4849551 silesia, small window log, compress cctx, 7084179 silesia, small hash log, compress cctx, 6526141 -silesia, small chain log, compress cctx, 4912197 -silesia, explicit params, compress cctx, 4794479 -silesia, uncompressed literals, compress cctx, 4849552 -silesia, uncompressed literals optimal, compress cctx, 4283237 +silesia, small chain log, compress cctx, 4912199 +silesia, explicit params, compress cctx, 4794480 +silesia, uncompressed literals, compress cctx, 4849551 +silesia, uncompressed literals optimal, compress cctx, 4283236 silesia, huffman literals, compress cctx, 6178460 -silesia, multithreaded with advanced params, compress cctx, 4849552 +silesia, multithreaded with advanced params, compress cctx, 4849551 github, level -5, compress cctx, 205285 github, level -5 with dict, compress cctx, 47294 github, level -3, compress cctx, 190643 @@ -100,50 +100,50 @@ github, multithreaded with advanced params, compress silesia, level -5, zstdcli, 6737655 silesia, level -3, zstdcli, 6444725 silesia, level -1, zstdcli, 6178508 -silesia, level 0, zstdcli, 4849600 -silesia, level 1, zstdcli, 5313252 -silesia, level 3, zstdcli, 4849600 -silesia, level 4, zstdcli, 4787018 -silesia, level 5, zstdcli, 4707842 +silesia, level 0, zstdcli, 4849599 +silesia, level 1, zstdcli, 5313250 +silesia, level 3, zstdcli, 4849599 +silesia, level 4, zstdcli, 4787017 +silesia, level 5, zstdcli, 4707838 silesia, level 6, zstdcli, 4666431 silesia, level 7, zstdcli, 4603429 -silesia, level 9, zstdcli, 4546049 -silesia, level 13, zstdcli, 4482183 +silesia, level 9, zstdcli, 4546053 +silesia, level 13, zstdcli, 4482179 silesia, level 16, zstdcli, 4360299 -silesia, level 19, zstdcli, 4283285 -silesia, long distance mode, zstdcli, 4840806 -silesia, multithreaded, zstdcli, 4849600 -silesia, multithreaded long distance mode, zstdcli, 4840806 +silesia, level 19, zstdcli, 4283284 +silesia, long distance mode, zstdcli, 4840807 +silesia, multithreaded, zstdcli, 4849599 +silesia, multithreaded long distance mode, zstdcli, 4840807 silesia, small window log, zstdcli, 7095967 silesia, small hash log, zstdcli, 6526189 -silesia, small chain log, zstdcli, 4912245 +silesia, small chain log, zstdcli, 4912247 silesia, explicit params, zstdcli, 4795856 silesia, uncompressed literals, zstdcli, 5128030 silesia, uncompressed literals optimal, zstdcli, 4317944 -silesia, huffman literals, zstdcli, 5326316 +silesia, huffman literals, zstdcli, 5326317 silesia, multithreaded with advanced params, zstdcli, 5128030 silesia.tar, level -5, zstdcli, 6738934 silesia.tar, level -3, zstdcli, 6448419 silesia.tar, level -1, zstdcli, 6186912 -silesia.tar, level 0, zstdcli, 4861512 +silesia.tar, level 0, zstdcli, 4861511 silesia.tar, level 1, zstdcli, 5336318 -silesia.tar, level 3, zstdcli, 4861512 +silesia.tar, level 3, zstdcli, 4861511 silesia.tar, level 4, zstdcli, 4800529 silesia.tar, level 5, zstdcli, 4720121 -silesia.tar, level 6, zstdcli, 4678661 -silesia.tar, level 7, zstdcli, 4614424 +silesia.tar, level 6, zstdcli, 4678663 +silesia.tar, level 7, zstdcli, 4614426 silesia.tar, level 9, zstdcli, 4556062 -silesia.tar, level 13, zstdcli, 4491768 +silesia.tar, level 13, zstdcli, 4491772 silesia.tar, level 16, zstdcli, 4356838 -silesia.tar, level 19, zstdcli, 4264396 -silesia.tar, no source size, zstdcli, 4861508 -silesia.tar, long distance mode, zstdcli, 4853226 -silesia.tar, multithreaded, zstdcli, 4861512 -silesia.tar, multithreaded long distance mode, zstdcli, 4853226 +silesia.tar, level 19, zstdcli, 4264392 +silesia.tar, no source size, zstdcli, 4861507 +silesia.tar, long distance mode, zstdcli, 4853225 +silesia.tar, multithreaded, zstdcli, 4861511 +silesia.tar, multithreaded long distance mode, zstdcli, 4853225 silesia.tar, small window log, zstdcli, 7101576 -silesia.tar, small hash log, zstdcli, 6529290 -silesia.tar, small chain log, zstdcli, 4917022 -silesia.tar, explicit params, zstdcli, 4821274 +silesia.tar, small hash log, zstdcli, 6529286 +silesia.tar, small chain log, zstdcli, 4917020 +silesia.tar, explicit params, zstdcli, 4821277 silesia.tar, uncompressed literals, zstdcli, 5129559 silesia.tar, uncompressed literals optimal, zstdcli, 4307404 silesia.tar, huffman literals, zstdcli, 5347610 @@ -231,63 +231,63 @@ github.tar, multithreaded with advanced params, zstdcli, silesia, level -5, advanced one pass, 6737607 silesia, level -3, advanced one pass, 6444677 silesia, level -1, advanced one pass, 6178460 -silesia, level 0, advanced one pass, 4849552 -silesia, level 1, advanced one pass, 5313204 -silesia, level 3, advanced one pass, 4849552 -silesia, level 4, advanced one pass, 4786970 -silesia, level 5 row 1, advanced one pass, 4710236 -silesia, level 5 row 2, advanced one pass, 4707794 -silesia, level 5, advanced one pass, 4707794 +silesia, level 0, advanced one pass, 4849551 +silesia, level 1, advanced one pass, 5313202 +silesia, level 3, advanced one pass, 4849551 +silesia, level 4, advanced one pass, 4786969 +silesia, level 5 row 1, advanced one pass, 4710233 +silesia, level 5 row 2, advanced one pass, 4707790 +silesia, level 5, advanced one pass, 4707790 silesia, level 6, advanced one pass, 4666383 -silesia, level 7 row 1, advanced one pass, 4596296 +silesia, level 7 row 1, advanced one pass, 4596297 silesia, level 7 row 2, advanced one pass, 4603381 silesia, level 7, advanced one pass, 4603381 -silesia, level 9, advanced one pass, 4546001 +silesia, level 9, advanced one pass, 4546005 silesia, level 12 row 1, advanced one pass, 4519288 -silesia, level 12 row 2, advanced one pass, 4521397 -silesia, level 13, advanced one pass, 4482135 +silesia, level 12 row 2, advanced one pass, 4521406 +silesia, level 13, advanced one pass, 4482131 silesia, level 16, advanced one pass, 4360251 -silesia, level 19, advanced one pass, 4283237 -silesia, no source size, advanced one pass, 4849552 +silesia, level 19, advanced one pass, 4283236 +silesia, no source size, advanced one pass, 4849551 silesia, long distance mode, advanced one pass, 4840738 -silesia, multithreaded, advanced one pass, 4849552 -silesia, multithreaded long distance mode, advanced one pass, 4840758 +silesia, multithreaded, advanced one pass, 4849551 +silesia, multithreaded long distance mode, advanced one pass, 4840759 silesia, small window log, advanced one pass, 7095919 silesia, small hash log, advanced one pass, 6526141 -silesia, small chain log, advanced one pass, 4912197 +silesia, small chain log, advanced one pass, 4912199 silesia, explicit params, advanced one pass, 4795856 silesia, uncompressed literals, advanced one pass, 5127982 silesia, uncompressed literals optimal, advanced one pass, 4317896 -silesia, huffman literals, advanced one pass, 5326268 +silesia, huffman literals, advanced one pass, 5326269 silesia, multithreaded with advanced params, advanced one pass, 5127982 silesia.tar, level -5, advanced one pass, 6738593 silesia.tar, level -3, advanced one pass, 6446372 silesia.tar, level -1, advanced one pass, 6186042 -silesia.tar, level 0, advanced one pass, 4861425 +silesia.tar, level 0, advanced one pass, 4861423 silesia.tar, level 1, advanced one pass, 5334885 -silesia.tar, level 3, advanced one pass, 4861425 -silesia.tar, level 4, advanced one pass, 4799630 +silesia.tar, level 3, advanced one pass, 4861423 +silesia.tar, level 4, advanced one pass, 4799632 silesia.tar, level 5 row 1, advanced one pass, 4722324 silesia.tar, level 5 row 2, advanced one pass, 4719256 silesia.tar, level 5, advanced one pass, 4719256 -silesia.tar, level 6, advanced one pass, 4677721 -silesia.tar, level 7 row 1, advanced one pass, 4606715 -silesia.tar, level 7 row 2, advanced one pass, 4613541 -silesia.tar, level 7, advanced one pass, 4613541 +silesia.tar, level 6, advanced one pass, 4677724 +silesia.tar, level 7 row 1, advanced one pass, 4606716 +silesia.tar, level 7 row 2, advanced one pass, 4613545 +silesia.tar, level 7, advanced one pass, 4613545 silesia.tar, level 9, advanced one pass, 4555426 -silesia.tar, level 12 row 1, advanced one pass, 4529459 -silesia.tar, level 12 row 2, advanced one pass, 4530256 -silesia.tar, level 13, advanced one pass, 4491764 +silesia.tar, level 12 row 1, advanced one pass, 4529458 +silesia.tar, level 12 row 2, advanced one pass, 4530257 +silesia.tar, level 13, advanced one pass, 4491768 silesia.tar, level 16, advanced one pass, 4356834 -silesia.tar, level 19, advanced one pass, 4264392 -silesia.tar, no source size, advanced one pass, 4861425 -silesia.tar, long distance mode, advanced one pass, 4847754 -silesia.tar, multithreaded, advanced one pass, 4861508 -silesia.tar, multithreaded long distance mode, advanced one pass, 4853222 +silesia.tar, level 19, advanced one pass, 4264388 +silesia.tar, no source size, advanced one pass, 4861423 +silesia.tar, long distance mode, advanced one pass, 4847753 +silesia.tar, multithreaded, advanced one pass, 4861507 +silesia.tar, multithreaded long distance mode, advanced one pass, 4853221 silesia.tar, small window log, advanced one pass, 7101530 -silesia.tar, small hash log, advanced one pass, 6529232 -silesia.tar, small chain log, advanced one pass, 4917041 -silesia.tar, explicit params, advanced one pass, 4807380 +silesia.tar, small hash log, advanced one pass, 6529228 +silesia.tar, small chain log, advanced one pass, 4917039 +silesia.tar, explicit params, advanced one pass, 4807383 silesia.tar, uncompressed literals, advanced one pass, 5129458 silesia.tar, uncompressed literals optimal, advanced one pass, 4307400 silesia.tar, huffman literals, advanced one pass, 5347335 @@ -525,63 +525,63 @@ github.tar, multithreaded with advanced params, advanced silesia, level -5, advanced one pass small out, 6737607 silesia, level -3, advanced one pass small out, 6444677 silesia, level -1, advanced one pass small out, 6178460 -silesia, level 0, advanced one pass small out, 4849552 -silesia, level 1, advanced one pass small out, 5313204 -silesia, level 3, advanced one pass small out, 4849552 -silesia, level 4, advanced one pass small out, 4786970 -silesia, level 5 row 1, advanced one pass small out, 4710236 -silesia, level 5 row 2, advanced one pass small out, 4707794 -silesia, level 5, advanced one pass small out, 4707794 +silesia, level 0, advanced one pass small out, 4849551 +silesia, level 1, advanced one pass small out, 5313202 +silesia, level 3, advanced one pass small out, 4849551 +silesia, level 4, advanced one pass small out, 4786969 +silesia, level 5 row 1, advanced one pass small out, 4710233 +silesia, level 5 row 2, advanced one pass small out, 4707790 +silesia, level 5, advanced one pass small out, 4707790 silesia, level 6, advanced one pass small out, 4666383 -silesia, level 7 row 1, advanced one pass small out, 4596296 +silesia, level 7 row 1, advanced one pass small out, 4596297 silesia, level 7 row 2, advanced one pass small out, 4603381 silesia, level 7, advanced one pass small out, 4603381 -silesia, level 9, advanced one pass small out, 4546001 +silesia, level 9, advanced one pass small out, 4546005 silesia, level 12 row 1, advanced one pass small out, 4519288 -silesia, level 12 row 2, advanced one pass small out, 4521397 -silesia, level 13, advanced one pass small out, 4482135 +silesia, level 12 row 2, advanced one pass small out, 4521406 +silesia, level 13, advanced one pass small out, 4482131 silesia, level 16, advanced one pass small out, 4360251 -silesia, level 19, advanced one pass small out, 4283237 -silesia, no source size, advanced one pass small out, 4849552 +silesia, level 19, advanced one pass small out, 4283236 +silesia, no source size, advanced one pass small out, 4849551 silesia, long distance mode, advanced one pass small out, 4840738 -silesia, multithreaded, advanced one pass small out, 4849552 -silesia, multithreaded long distance mode, advanced one pass small out, 4840758 +silesia, multithreaded, advanced one pass small out, 4849551 +silesia, multithreaded long distance mode, advanced one pass small out, 4840759 silesia, small window log, advanced one pass small out, 7095919 silesia, small hash log, advanced one pass small out, 6526141 -silesia, small chain log, advanced one pass small out, 4912197 +silesia, small chain log, advanced one pass small out, 4912199 silesia, explicit params, advanced one pass small out, 4795856 silesia, uncompressed literals, advanced one pass small out, 5127982 silesia, uncompressed literals optimal, advanced one pass small out, 4317896 -silesia, huffman literals, advanced one pass small out, 5326268 +silesia, huffman literals, advanced one pass small out, 5326269 silesia, multithreaded with advanced params, advanced one pass small out, 5127982 silesia.tar, level -5, advanced one pass small out, 6738593 silesia.tar, level -3, advanced one pass small out, 6446372 silesia.tar, level -1, advanced one pass small out, 6186042 -silesia.tar, level 0, advanced one pass small out, 4861425 +silesia.tar, level 0, advanced one pass small out, 4861423 silesia.tar, level 1, advanced one pass small out, 5334885 -silesia.tar, level 3, advanced one pass small out, 4861425 -silesia.tar, level 4, advanced one pass small out, 4799630 +silesia.tar, level 3, advanced one pass small out, 4861423 +silesia.tar, level 4, advanced one pass small out, 4799632 silesia.tar, level 5 row 1, advanced one pass small out, 4722324 silesia.tar, level 5 row 2, advanced one pass small out, 4719256 silesia.tar, level 5, advanced one pass small out, 4719256 -silesia.tar, level 6, advanced one pass small out, 4677721 -silesia.tar, level 7 row 1, advanced one pass small out, 4606715 -silesia.tar, level 7 row 2, advanced one pass small out, 4613541 -silesia.tar, level 7, advanced one pass small out, 4613541 +silesia.tar, level 6, advanced one pass small out, 4677724 +silesia.tar, level 7 row 1, advanced one pass small out, 4606716 +silesia.tar, level 7 row 2, advanced one pass small out, 4613545 +silesia.tar, level 7, advanced one pass small out, 4613545 silesia.tar, level 9, advanced one pass small out, 4555426 -silesia.tar, level 12 row 1, advanced one pass small out, 4529459 -silesia.tar, level 12 row 2, advanced one pass small out, 4530256 -silesia.tar, level 13, advanced one pass small out, 4491764 +silesia.tar, level 12 row 1, advanced one pass small out, 4529458 +silesia.tar, level 12 row 2, advanced one pass small out, 4530257 +silesia.tar, level 13, advanced one pass small out, 4491768 silesia.tar, level 16, advanced one pass small out, 4356834 -silesia.tar, level 19, advanced one pass small out, 4264392 -silesia.tar, no source size, advanced one pass small out, 4861425 -silesia.tar, long distance mode, advanced one pass small out, 4847754 -silesia.tar, multithreaded, advanced one pass small out, 4861508 -silesia.tar, multithreaded long distance mode, advanced one pass small out, 4853222 +silesia.tar, level 19, advanced one pass small out, 4264388 +silesia.tar, no source size, advanced one pass small out, 4861423 +silesia.tar, long distance mode, advanced one pass small out, 4847753 +silesia.tar, multithreaded, advanced one pass small out, 4861507 +silesia.tar, multithreaded long distance mode, advanced one pass small out, 4853221 silesia.tar, small window log, advanced one pass small out, 7101530 -silesia.tar, small hash log, advanced one pass small out, 6529232 -silesia.tar, small chain log, advanced one pass small out, 4917041 -silesia.tar, explicit params, advanced one pass small out, 4807380 +silesia.tar, small hash log, advanced one pass small out, 6529228 +silesia.tar, small chain log, advanced one pass small out, 4917039 +silesia.tar, explicit params, advanced one pass small out, 4807383 silesia.tar, uncompressed literals, advanced one pass small out, 5129458 silesia.tar, uncompressed literals optimal, advanced one pass small out, 4307400 silesia.tar, huffman literals, advanced one pass small out, 5347335 @@ -819,63 +819,63 @@ github.tar, multithreaded with advanced params, advanced silesia, level -5, advanced streaming, 6882505 silesia, level -3, advanced streaming, 6568376 silesia, level -1, advanced streaming, 6183403 -silesia, level 0, advanced streaming, 4849552 -silesia, level 1, advanced streaming, 5314162 -silesia, level 3, advanced streaming, 4849552 -silesia, level 4, advanced streaming, 4786970 -silesia, level 5 row 1, advanced streaming, 4710236 -silesia, level 5 row 2, advanced streaming, 4707794 -silesia, level 5, advanced streaming, 4707794 +silesia, level 0, advanced streaming, 4849551 +silesia, level 1, advanced streaming, 5314161 +silesia, level 3, advanced streaming, 4849551 +silesia, level 4, advanced streaming, 4786969 +silesia, level 5 row 1, advanced streaming, 4710233 +silesia, level 5 row 2, advanced streaming, 4707790 +silesia, level 5, advanced streaming, 4707790 silesia, level 6, advanced streaming, 4666383 -silesia, level 7 row 1, advanced streaming, 4596296 +silesia, level 7 row 1, advanced streaming, 4596297 silesia, level 7 row 2, advanced streaming, 4603381 silesia, level 7, advanced streaming, 4603381 -silesia, level 9, advanced streaming, 4546001 +silesia, level 9, advanced streaming, 4546005 silesia, level 12 row 1, advanced streaming, 4519288 -silesia, level 12 row 2, advanced streaming, 4521397 -silesia, level 13, advanced streaming, 4482135 +silesia, level 12 row 2, advanced streaming, 4521406 +silesia, level 13, advanced streaming, 4482131 silesia, level 16, advanced streaming, 4360251 -silesia, level 19, advanced streaming, 4283237 -silesia, no source size, advanced streaming, 4849516 +silesia, level 19, advanced streaming, 4283236 +silesia, no source size, advanced streaming, 4849515 silesia, long distance mode, advanced streaming, 4840738 -silesia, multithreaded, advanced streaming, 4849552 -silesia, multithreaded long distance mode, advanced streaming, 4840758 +silesia, multithreaded, advanced streaming, 4849551 +silesia, multithreaded long distance mode, advanced streaming, 4840759 silesia, small window log, advanced streaming, 7112062 silesia, small hash log, advanced streaming, 6526141 -silesia, small chain log, advanced streaming, 4912197 +silesia, small chain log, advanced streaming, 4912199 silesia, explicit params, advanced streaming, 4795884 silesia, uncompressed literals, advanced streaming, 5127982 silesia, uncompressed literals optimal, advanced streaming, 4317896 -silesia, huffman literals, advanced streaming, 5331168 +silesia, huffman literals, advanced streaming, 5331171 silesia, multithreaded with advanced params, advanced streaming, 5127982 silesia.tar, level -5, advanced streaming, 6982759 silesia.tar, level -3, advanced streaming, 6641283 silesia.tar, level -1, advanced streaming, 6190795 -silesia.tar, level 0, advanced streaming, 4861427 -silesia.tar, level 1, advanced streaming, 5336939 -silesia.tar, level 3, advanced streaming, 4861427 -silesia.tar, level 4, advanced streaming, 4799630 +silesia.tar, level 0, advanced streaming, 4861425 +silesia.tar, level 1, advanced streaming, 5336941 +silesia.tar, level 3, advanced streaming, 4861425 +silesia.tar, level 4, advanced streaming, 4799632 silesia.tar, level 5 row 1, advanced streaming, 4722329 silesia.tar, level 5 row 2, advanced streaming, 4719261 silesia.tar, level 5, advanced streaming, 4719261 -silesia.tar, level 6, advanced streaming, 4677729 -silesia.tar, level 7 row 1, advanced streaming, 4606715 -silesia.tar, level 7 row 2, advanced streaming, 4613544 -silesia.tar, level 7, advanced streaming, 4613544 +silesia.tar, level 6, advanced streaming, 4677732 +silesia.tar, level 7 row 1, advanced streaming, 4606717 +silesia.tar, level 7 row 2, advanced streaming, 4613548 +silesia.tar, level 7, advanced streaming, 4613548 silesia.tar, level 9, advanced streaming, 4555432 -silesia.tar, level 12 row 1, advanced streaming, 4529459 -silesia.tar, level 12 row 2, advanced streaming, 4530258 -silesia.tar, level 13, advanced streaming, 4491765 +silesia.tar, level 12 row 1, advanced streaming, 4529458 +silesia.tar, level 12 row 2, advanced streaming, 4530259 +silesia.tar, level 13, advanced streaming, 4491769 silesia.tar, level 16, advanced streaming, 4356834 -silesia.tar, level 19, advanced streaming, 4264392 -silesia.tar, no source size, advanced streaming, 4861423 -silesia.tar, long distance mode, advanced streaming, 4847754 -silesia.tar, multithreaded, advanced streaming, 4861508 -silesia.tar, multithreaded long distance mode, advanced streaming, 4853222 +silesia.tar, level 19, advanced streaming, 4264388 +silesia.tar, no source size, advanced streaming, 4861421 +silesia.tar, long distance mode, advanced streaming, 4847753 +silesia.tar, multithreaded, advanced streaming, 4861507 +silesia.tar, multithreaded long distance mode, advanced streaming, 4853221 silesia.tar, small window log, advanced streaming, 7118769 -silesia.tar, small hash log, advanced streaming, 6529235 -silesia.tar, small chain log, advanced streaming, 4917021 -silesia.tar, explicit params, advanced streaming, 4807399 +silesia.tar, small hash log, advanced streaming, 6529231 +silesia.tar, small chain log, advanced streaming, 4917019 +silesia.tar, explicit params, advanced streaming, 4807403 silesia.tar, uncompressed literals, advanced streaming, 5129461 silesia.tar, uncompressed literals optimal, advanced streaming, 4307400 silesia.tar, huffman literals, advanced streaming, 5352360 @@ -1113,38 +1113,38 @@ github.tar, multithreaded with advanced params, advanced silesia, level -5, old streaming, 6882505 silesia, level -3, old streaming, 6568376 silesia, level -1, old streaming, 6183403 -silesia, level 0, old streaming, 4849552 -silesia, level 1, old streaming, 5314162 -silesia, level 3, old streaming, 4849552 -silesia, level 4, old streaming, 4786970 -silesia, level 5, old streaming, 4707794 +silesia, level 0, old streaming, 4849551 +silesia, level 1, old streaming, 5314161 +silesia, level 3, old streaming, 4849551 +silesia, level 4, old streaming, 4786969 +silesia, level 5, old streaming, 4707790 silesia, level 6, old streaming, 4666383 silesia, level 7, old streaming, 4603381 -silesia, level 9, old streaming, 4546001 -silesia, level 13, old streaming, 4482135 +silesia, level 9, old streaming, 4546005 +silesia, level 13, old streaming, 4482131 silesia, level 16, old streaming, 4360251 -silesia, level 19, old streaming, 4283237 -silesia, no source size, old streaming, 4849516 -silesia, uncompressed literals, old streaming, 4849552 -silesia, uncompressed literals optimal, old streaming, 4283237 +silesia, level 19, old streaming, 4283236 +silesia, no source size, old streaming, 4849515 +silesia, uncompressed literals, old streaming, 4849551 +silesia, uncompressed literals optimal, old streaming, 4283236 silesia, huffman literals, old streaming, 6183403 silesia.tar, level -5, old streaming, 6982759 silesia.tar, level -3, old streaming, 6641283 silesia.tar, level -1, old streaming, 6190795 -silesia.tar, level 0, old streaming, 4861427 -silesia.tar, level 1, old streaming, 5336939 -silesia.tar, level 3, old streaming, 4861427 -silesia.tar, level 4, old streaming, 4799630 +silesia.tar, level 0, old streaming, 4861425 +silesia.tar, level 1, old streaming, 5336941 +silesia.tar, level 3, old streaming, 4861425 +silesia.tar, level 4, old streaming, 4799632 silesia.tar, level 5, old streaming, 4719261 -silesia.tar, level 6, old streaming, 4677729 -silesia.tar, level 7, old streaming, 4613544 +silesia.tar, level 6, old streaming, 4677732 +silesia.tar, level 7, old streaming, 4613548 silesia.tar, level 9, old streaming, 4555432 -silesia.tar, level 13, old streaming, 4491765 +silesia.tar, level 13, old streaming, 4491769 silesia.tar, level 16, old streaming, 4356834 -silesia.tar, level 19, old streaming, 4264392 -silesia.tar, no source size, old streaming, 4861423 -silesia.tar, uncompressed literals, old streaming, 4861427 -silesia.tar, uncompressed literals optimal, old streaming, 4264392 +silesia.tar, level 19, old streaming, 4264388 +silesia.tar, no source size, old streaming, 4861421 +silesia.tar, uncompressed literals, old streaming, 4861425 +silesia.tar, uncompressed literals optimal, old streaming, 4264388 silesia.tar, huffman literals, old streaming, 6190795 github, level -5, old streaming, 205285 github, level -5 with dict, old streaming, 46718 @@ -1215,55 +1215,55 @@ github.tar, huffman literals, old stre silesia, level -5, old streaming advanced, 6882505 silesia, level -3, old streaming advanced, 6568376 silesia, level -1, old streaming advanced, 6183403 -silesia, level 0, old streaming advanced, 4849552 -silesia, level 1, old streaming advanced, 5314162 -silesia, level 3, old streaming advanced, 4849552 -silesia, level 4, old streaming advanced, 4786970 -silesia, level 5, old streaming advanced, 4707794 +silesia, level 0, old streaming advanced, 4849551 +silesia, level 1, old streaming advanced, 5314161 +silesia, level 3, old streaming advanced, 4849551 +silesia, level 4, old streaming advanced, 4786969 +silesia, level 5, old streaming advanced, 4707790 silesia, level 6, old streaming advanced, 4666383 silesia, level 7, old streaming advanced, 4603381 -silesia, level 9, old streaming advanced, 4546001 -silesia, level 13, old streaming advanced, 4482135 +silesia, level 9, old streaming advanced, 4546005 +silesia, level 13, old streaming advanced, 4482131 silesia, level 16, old streaming advanced, 4360251 -silesia, level 19, old streaming advanced, 4283237 -silesia, no source size, old streaming advanced, 4849516 -silesia, long distance mode, old streaming advanced, 4849552 -silesia, multithreaded, old streaming advanced, 4849552 -silesia, multithreaded long distance mode, old streaming advanced, 4849552 +silesia, level 19, old streaming advanced, 4283236 +silesia, no source size, old streaming advanced, 4849515 +silesia, long distance mode, old streaming advanced, 4849551 +silesia, multithreaded, old streaming advanced, 4849551 +silesia, multithreaded long distance mode, old streaming advanced, 4849551 silesia, small window log, old streaming advanced, 7112062 silesia, small hash log, old streaming advanced, 6526141 -silesia, small chain log, old streaming advanced, 4912197 +silesia, small chain log, old streaming advanced, 4912199 silesia, explicit params, old streaming advanced, 4795884 -silesia, uncompressed literals, old streaming advanced, 4849552 -silesia, uncompressed literals optimal, old streaming advanced, 4283237 +silesia, uncompressed literals, old streaming advanced, 4849551 +silesia, uncompressed literals optimal, old streaming advanced, 4283236 silesia, huffman literals, old streaming advanced, 6183403 -silesia, multithreaded with advanced params, old streaming advanced, 4849552 +silesia, multithreaded with advanced params, old streaming advanced, 4849551 silesia.tar, level -5, old streaming advanced, 6982759 silesia.tar, level -3, old streaming advanced, 6641283 silesia.tar, level -1, old streaming advanced, 6190795 -silesia.tar, level 0, old streaming advanced, 4861427 -silesia.tar, level 1, old streaming advanced, 5336939 -silesia.tar, level 3, old streaming advanced, 4861427 -silesia.tar, level 4, old streaming advanced, 4799630 +silesia.tar, level 0, old streaming advanced, 4861425 +silesia.tar, level 1, old streaming advanced, 5336941 +silesia.tar, level 3, old streaming advanced, 4861425 +silesia.tar, level 4, old streaming advanced, 4799632 silesia.tar, level 5, old streaming advanced, 4719261 -silesia.tar, level 6, old streaming advanced, 4677729 -silesia.tar, level 7, old streaming advanced, 4613544 +silesia.tar, level 6, old streaming advanced, 4677732 +silesia.tar, level 7, old streaming advanced, 4613548 silesia.tar, level 9, old streaming advanced, 4555432 -silesia.tar, level 13, old streaming advanced, 4491765 +silesia.tar, level 13, old streaming advanced, 4491769 silesia.tar, level 16, old streaming advanced, 4356834 -silesia.tar, level 19, old streaming advanced, 4264392 -silesia.tar, no source size, old streaming advanced, 4861423 -silesia.tar, long distance mode, old streaming advanced, 4861427 -silesia.tar, multithreaded, old streaming advanced, 4861427 -silesia.tar, multithreaded long distance mode, old streaming advanced, 4861427 +silesia.tar, level 19, old streaming advanced, 4264388 +silesia.tar, no source size, old streaming advanced, 4861421 +silesia.tar, long distance mode, old streaming advanced, 4861425 +silesia.tar, multithreaded, old streaming advanced, 4861425 +silesia.tar, multithreaded long distance mode, old streaming advanced, 4861425 silesia.tar, small window log, old streaming advanced, 7118772 -silesia.tar, small hash log, old streaming advanced, 6529235 -silesia.tar, small chain log, old streaming advanced, 4917021 -silesia.tar, explicit params, old streaming advanced, 4807399 -silesia.tar, uncompressed literals, old streaming advanced, 4861427 -silesia.tar, uncompressed literals optimal, old streaming advanced, 4264392 +silesia.tar, small hash log, old streaming advanced, 6529231 +silesia.tar, small chain log, old streaming advanced, 4917019 +silesia.tar, explicit params, old streaming advanced, 4807403 +silesia.tar, uncompressed literals, old streaming advanced, 4861425 +silesia.tar, uncompressed literals optimal, old streaming advanced, 4264388 silesia.tar, huffman literals, old streaming advanced, 6190795 -silesia.tar, multithreaded with advanced params, old streaming advanced, 4861427 +silesia.tar, multithreaded with advanced params, old streaming advanced, 4861425 github, level -5, old streaming advanced, 216734 github, level -5 with dict, old streaming advanced, 49562 github, level -3, old streaming advanced, 192160