Merge pull request #3302 from daniellerozenblit/optimal-huff-depth-speed

Optimal huff depth speed improvements
This commit is contained in:
daniellerozenblit
2023-01-03 12:51:51 -05:00
committed by GitHub
2 changed files with 27 additions and 20 deletions
+17 -10
View File
@@ -1261,28 +1261,35 @@ unsigned HUF_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxS
if (depthMode == HUF_depth_optimal) { /** Test valid depths and return optimal **/
BYTE* dst = (BYTE*)workSpace + sizeof(HUF_WriteCTableWksp);
size_t dstSize = wkspSize - sizeof(HUF_WriteCTableWksp);
size_t optSize = ((size_t) ~0);
unsigned huffLog;
size_t maxBits, hSize, newSize;
const unsigned symbolCardinality = HUF_cardinality(count, maxSymbolValue);
const unsigned minTableLog = HUF_minTableLog(symbolCardinality);
size_t optSize = ((size_t) ~0) - 1;
unsigned optLogGuess;
if (wkspSize < sizeof(HUF_buildCTable_wksp_tables)) return optLog;
if (wkspSize < sizeof(HUF_buildCTable_wksp_tables)) return optLog; /** Assert workspace is large enough **/
/* Search until size increases */
for (optLogGuess = minTableLog; optLogGuess <= maxTableLog; optLogGuess++) {
maxBits = HUF_buildCTable_wksp(table, count, maxSymbolValue, optLogGuess, workSpace, wkspSize);
for (huffLog = HUF_minTableLog(symbolCardinality); huffLog <= maxTableLog; huffLog++) {
maxBits = HUF_buildCTable_wksp(table, count,
maxSymbolValue, huffLog,
workSpace, wkspSize);
if (ERR_isError(maxBits)) continue;
hSize = HUF_writeCTable_wksp(dst, dstSize, table, maxSymbolValue, (U32)maxBits,
workSpace, wkspSize);
if (maxBits < optLogGuess && optLogGuess > minTableLog) break;
hSize = HUF_writeCTable_wksp(dst, dstSize, table, maxSymbolValue, (U32)maxBits, workSpace, wkspSize);
if (ERR_isError(hSize)) continue;
newSize = HUF_estimateCompressedSize(table, count, maxSymbolValue) + hSize;
if (newSize > optSize + 1) {
break;
}
if (newSize < optSize) {
optSize = newSize;
optLog = huffLog;
optLog = optLogGuess;
}
}
}
+10 -10
View File
@@ -12,9 +12,9 @@ silesia.tar, level 7, compress
silesia.tar, level 9, compress simple, 4552899
silesia.tar, level 13, compress simple, 4502956
silesia.tar, level 16, compress simple, 4360527
silesia.tar, level 19, compress simple, 4266970
silesia.tar, level 19, compress simple, 4267021
silesia.tar, uncompressed literals, compress simple, 4854086
silesia.tar, uncompressed literals optimal, compress simple, 4266970
silesia.tar, uncompressed literals optimal, compress simple, 4267021
silesia.tar, huffman literals, compress simple, 6179047
github.tar, level -5, compress simple, 52115
github.tar, level -3, compress simple, 45678
@@ -135,7 +135,7 @@ silesia.tar, level 7, zstdcli,
silesia.tar, level 9, zstdcli, 4552903
silesia.tar, level 13, zstdcli, 4502960
silesia.tar, level 16, zstdcli, 4360531
silesia.tar, level 19, zstdcli, 4266974
silesia.tar, level 19, zstdcli, 4267025
silesia.tar, no source size, zstdcli, 4854160
silesia.tar, long distance mode, zstdcli, 4845745
silesia.tar, multithreaded, zstdcli, 4854164
@@ -283,7 +283,7 @@ silesia.tar, level 12 row 1, advanced
silesia.tar, level 12 row 2, advanced one pass, 4513797
silesia.tar, level 13, advanced one pass, 4502956
silesia.tar, level 16, advanced one pass, 4360527
silesia.tar, level 19, advanced one pass, 4266970
silesia.tar, level 19, advanced one pass, 4267021
silesia.tar, no source size, advanced one pass, 4854086
silesia.tar, long distance mode, advanced one pass, 4840452
silesia.tar, multithreaded, advanced one pass, 4854160
@@ -601,7 +601,7 @@ silesia.tar, level 12 row 1, advanced
silesia.tar, level 12 row 2, advanced one pass small out, 4513797
silesia.tar, level 13, advanced one pass small out, 4502956
silesia.tar, level 16, advanced one pass small out, 4360527
silesia.tar, level 19, advanced one pass small out, 4266970
silesia.tar, level 19, advanced one pass small out, 4267021
silesia.tar, no source size, advanced one pass small out, 4854086
silesia.tar, long distance mode, advanced one pass small out, 4840452
silesia.tar, multithreaded, advanced one pass small out, 4854160
@@ -919,7 +919,7 @@ silesia.tar, level 12 row 1, advanced
silesia.tar, level 12 row 2, advanced streaming, 4513797
silesia.tar, level 13, advanced streaming, 4502956
silesia.tar, level 16, advanced streaming, 4360527
silesia.tar, level 19, advanced streaming, 4266970
silesia.tar, level 19, advanced streaming, 4267021
silesia.tar, no source size, advanced streaming, 4859267
silesia.tar, long distance mode, advanced streaming, 4840452
silesia.tar, multithreaded, advanced streaming, 4854160
@@ -1213,10 +1213,10 @@ silesia.tar, level 7, old stre
silesia.tar, level 9, old streaming, 4552900
silesia.tar, level 13, old streaming, 4502956
silesia.tar, level 16, old streaming, 4360527
silesia.tar, level 19, old streaming, 4266970
silesia.tar, level 19, old streaming, 4267021
silesia.tar, no source size, old streaming, 4859267
silesia.tar, uncompressed literals, old streaming, 4859271
silesia.tar, uncompressed literals optimal, old streaming, 4266970
silesia.tar, uncompressed literals optimal, old streaming, 4267021
silesia.tar, huffman literals, old streaming, 6179056
github, level -5, old streaming, 204407
github, level -5 with dict, old streaming, 46718
@@ -1323,7 +1323,7 @@ silesia.tar, level 7, old stre
silesia.tar, level 9, old streaming advanced, 4552900
silesia.tar, level 13, old streaming advanced, 4502956
silesia.tar, level 16, old streaming advanced, 4360527
silesia.tar, level 19, old streaming advanced, 4266970
silesia.tar, level 19, old streaming advanced, 4267021
silesia.tar, no source size, old streaming advanced, 4859267
silesia.tar, long distance mode, old streaming advanced, 4859271
silesia.tar, multithreaded, old streaming advanced, 4859271
@@ -1333,7 +1333,7 @@ silesia.tar, small hash log, old stre
silesia.tar, small chain log, old streaming advanced, 4917021
silesia.tar, explicit params, old streaming advanced, 4806873
silesia.tar, uncompressed literals, old streaming advanced, 4859271
silesia.tar, uncompressed literals optimal, old streaming advanced, 4266970
silesia.tar, uncompressed literals optimal, old streaming advanced, 4267021
silesia.tar, huffman literals, old streaming advanced, 6179056
silesia.tar, multithreaded with advanced params, old streaming advanced, 4859271
github, level -5, old streaming advanced, 213265
1 Data Config Method Total compressed size
12 silesia.tar level 9 compress simple 4552899
13 silesia.tar level 13 compress simple 4502956
14 silesia.tar level 16 compress simple 4360527
15 silesia.tar level 19 compress simple 4266970 4267021
16 silesia.tar uncompressed literals compress simple 4854086
17 silesia.tar uncompressed literals optimal compress simple 4266970 4267021
18 silesia.tar huffman literals compress simple 6179047
19 github.tar level -5 compress simple 52115
20 github.tar level -3 compress simple 45678
135 silesia.tar level 9 zstdcli 4552903
136 silesia.tar level 13 zstdcli 4502960
137 silesia.tar level 16 zstdcli 4360531
138 silesia.tar level 19 zstdcli 4266974 4267025
139 silesia.tar no source size zstdcli 4854160
140 silesia.tar long distance mode zstdcli 4845745
141 silesia.tar multithreaded zstdcli 4854164
283 silesia.tar level 12 row 2 advanced one pass 4513797
284 silesia.tar level 13 advanced one pass 4502956
285 silesia.tar level 16 advanced one pass 4360527
286 silesia.tar level 19 advanced one pass 4266970 4267021
287 silesia.tar no source size advanced one pass 4854086
288 silesia.tar long distance mode advanced one pass 4840452
289 silesia.tar multithreaded advanced one pass 4854160
601 silesia.tar level 12 row 2 advanced one pass small out 4513797
602 silesia.tar level 13 advanced one pass small out 4502956
603 silesia.tar level 16 advanced one pass small out 4360527
604 silesia.tar level 19 advanced one pass small out 4266970 4267021
605 silesia.tar no source size advanced one pass small out 4854086
606 silesia.tar long distance mode advanced one pass small out 4840452
607 silesia.tar multithreaded advanced one pass small out 4854160
919 silesia.tar level 12 row 2 advanced streaming 4513797
920 silesia.tar level 13 advanced streaming 4502956
921 silesia.tar level 16 advanced streaming 4360527
922 silesia.tar level 19 advanced streaming 4266970 4267021
923 silesia.tar no source size advanced streaming 4859267
924 silesia.tar long distance mode advanced streaming 4840452
925 silesia.tar multithreaded advanced streaming 4854160
1213 silesia.tar level 9 old streaming 4552900
1214 silesia.tar level 13 old streaming 4502956
1215 silesia.tar level 16 old streaming 4360527
1216 silesia.tar level 19 old streaming 4266970 4267021
1217 silesia.tar no source size old streaming 4859267
1218 silesia.tar uncompressed literals old streaming 4859271
1219 silesia.tar uncompressed literals optimal old streaming 4266970 4267021
1220 silesia.tar huffman literals old streaming 6179056
1221 github level -5 old streaming 204407
1222 github level -5 with dict old streaming 46718
1323 silesia.tar level 9 old streaming advanced 4552900
1324 silesia.tar level 13 old streaming advanced 4502956
1325 silesia.tar level 16 old streaming advanced 4360527
1326 silesia.tar level 19 old streaming advanced 4266970 4267021
1327 silesia.tar no source size old streaming advanced 4859267
1328 silesia.tar long distance mode old streaming advanced 4859271
1329 silesia.tar multithreaded old streaming advanced 4859271
1333 silesia.tar small chain log old streaming advanced 4917021
1334 silesia.tar explicit params old streaming advanced 4806873
1335 silesia.tar uncompressed literals old streaming advanced 4859271
1336 silesia.tar uncompressed literals optimal old streaming advanced 4266970 4267021
1337 silesia.tar huffman literals old streaming advanced 6179056
1338 silesia.tar multithreaded with advanced params old streaming advanced 4859271
1339 github level -5 old streaming advanced 213265