diff --git a/tests/regression/config.c b/tests/regression/config.c index 15713d7e..4a792e9c 100644 --- a/tests/regression/config.c +++ b/tests/regression/config.c @@ -13,7 +13,7 @@ /* Define a config for each fast level we want to test with. */ #define FAST_LEVEL(x) \ param_value_t const level_fast##x##_param_values[] = { \ - {.param = ZSTD_p_compressionLevel, .value = (unsigned)-x}, \ + {.param = ZSTD_c_compressionLevel, .value = -x}, \ }; \ config_t const level_fast##x = { \ .name = "level -" #x, \ @@ -28,23 +28,22 @@ }; /* Define a config for each level we want to test with. */ -#define LEVEL(x) \ - param_value_t const level_##x##_param_values[] = { \ - {.param = ZSTD_p_compressionLevel, .value = (unsigned)x}, \ - }; \ - config_t const level_##x = { \ - .name = "level " #x, \ - .cli_args = "-" #x, \ - .param_values = PARAM_VALUES(level_##x##_param_values), \ - }; \ - config_t const level_##x##_dict = { \ - .name = "level " #x " with dict", \ - .cli_args = "-" #x, \ - .param_values = PARAM_VALUES(level_##x##_param_values), \ - .use_dictionary = 1, \ +#define LEVEL(x) \ + param_value_t const level_##x##_param_values[] = { \ + {.param = ZSTD_c_compressionLevel, .value = x}, \ + }; \ + config_t const level_##x = { \ + .name = "level " #x, \ + .cli_args = "-" #x, \ + .param_values = PARAM_VALUES(level_##x##_param_values), \ + }; \ + config_t const level_##x##_dict = { \ + .name = "level " #x " with dict", \ + .cli_args = "-" #x, \ + .param_values = PARAM_VALUES(level_##x##_param_values), \ + .use_dictionary = 1, \ }; - #define PARAM_VALUES(pv) \ { .data = pv, .size = sizeof(pv) / sizeof((pv)[0]) } @@ -56,7 +55,7 @@ static config_t no_pledged_src_size = { .name = "no source size", .cli_args = "", - .param_values = {.data = NULL, .size = 0}, + .param_values = PARAM_VALUES(level_0_param_values), .no_pledged_src_size = 1, }; @@ -82,8 +81,61 @@ int config_get_level(config_t const* config) { param_values_t const params = config->param_values; size_t i; for (size_t i = 0; i < params.size; ++i) { - if (params.data[i].param == ZSTD_p_compressionLevel) - return params.data[i].value; + if (params.data[i].param == ZSTD_c_compressionLevel) + return (int)params.data[i].value; } return CONFIG_NO_LEVEL; } + +ZSTD_parameters config_get_zstd_params( + config_t const* config, + uint64_t srcSize, + size_t dictSize) { + ZSTD_parameters zparams = {}; + param_values_t const params = config->param_values; + int level = config_get_level(config); + if (level == CONFIG_NO_LEVEL) + level = 3; + zparams = ZSTD_getParams( + level, + config->no_pledged_src_size ? ZSTD_CONTENTSIZE_UNKNOWN : srcSize, + dictSize); + for (size_t i = 0; i < params.size; ++i) { + unsigned const value = params.data[i].value; + switch (params.data[i].param) { + case ZSTD_c_contentSizeFlag: + zparams.fParams.contentSizeFlag = value; + break; + case ZSTD_c_checksumFlag: + zparams.fParams.checksumFlag = value; + break; + case ZSTD_c_dictIDFlag: + zparams.fParams.noDictIDFlag = !value; + break; + case ZSTD_c_windowLog: + zparams.cParams.windowLog = value; + break; + case ZSTD_c_chainLog: + zparams.cParams.chainLog = value; + break; + case ZSTD_c_hashLog: + zparams.cParams.hashLog = value; + break; + case ZSTD_c_searchLog: + zparams.cParams.searchLog = value; + break; + case ZSTD_c_minMatch: + zparams.cParams.minMatch = value; + break; + case ZSTD_c_targetLength: + zparams.cParams.targetLength = value; + break; + case ZSTD_c_compressionStrategy: + zparams.cParams.strategy = (ZSTD_strategy)value; + break; + default: + break; + } + } + return zparams; +} diff --git a/tests/regression/config.h b/tests/regression/config.h index 164f48b5..3cd0308a 100644 --- a/tests/regression/config.h +++ b/tests/regression/config.h @@ -20,7 +20,7 @@ typedef struct { ZSTD_cParameter param; - unsigned value; + int value; } param_value_t; typedef struct { @@ -70,6 +70,14 @@ int config_skip_data(config_t const* config, data_t const* data); */ int config_get_level(config_t const* config); +/** + * Returns the compression parameters specified by the config. + */ +ZSTD_parameters config_get_zstd_params( + config_t const* config, + uint64_t srcSize, + size_t dictSize); + /** * The NULL-terminated list of configs. */ diff --git a/tests/regression/method.c b/tests/regression/method.c index 3fedcbe7..a43e9148 100644 --- a/tests/regression/method.c +++ b/tests/regression/method.c @@ -15,6 +15,8 @@ #include +#define MIN(x, y) ((x) < (y) ? (x) : (y)) + static char const* g_zstdcli = NULL; void method_set_zstdcli(char const* zstdcli) { @@ -35,6 +37,7 @@ void method_set_zstdcli(char const* zstdcli) { typedef struct { method_state_t base; data_buffers_t inputs; /**< The input buffer for each file. */ + data_buffer_t dictionary; /**< The dictionary. */ data_buffer_t compressed; /**< The compressed data buffer. */ data_buffer_t decompressed; /**< The decompressed data buffer. */ } buffer_state_t; @@ -54,6 +57,7 @@ static method_state_t* buffer_state_create(data_t const* data) { return NULL; state->base.data = data; state->inputs = data_buffers_get(data); + state->dictionary = data_buffer_get_dict(data); size_t const max_size = buffers_max_size(state->inputs); state->compressed = data_buffer_create(ZSTD_compressBound(max_size)); state->decompressed = data_buffer_create(max_size); @@ -67,7 +71,9 @@ static void buffer_state_destroy(method_state_t* base) { free(state); } -static int buffer_state_bad(buffer_state_t const* state) { +static int buffer_state_bad( + buffer_state_t const* state, + config_t const* config) { if (state == NULL) { fprintf(stderr, "buffer_state_t is NULL\n"); return 1; @@ -77,13 +83,17 @@ static int buffer_state_bad(buffer_state_t const* state) { fprintf(stderr, "buffer state allocation failure\n"); return 1; } + if (config->use_dictionary && state->dictionary.data == NULL) { + fprintf(stderr, "dictionary loading failed\n"); + return 1; + } return 0; } static result_t simple_compress(method_state_t* base, config_t const* config) { buffer_state_t* state = container_of(base, buffer_state_t, base); - if (buffer_state_bad(state)) + if (buffer_state_bad(state, config)) return result_error(result_error_system_error); /* Keep the tests short by skipping directories, since behavior shouldn't @@ -132,10 +142,10 @@ static result_t compress_cctx_compress( config_t const* config) { buffer_state_t* state = container_of(base, buffer_state_t, base); - if (buffer_state_bad(state)) + if (buffer_state_bad(state, config)) return result_error(result_error_system_error); - if (config->use_dictionary || config->no_pledged_src_size) + if (config->no_pledged_src_size) return result_error(result_error_skip); if (base->data->type != data_type_dir) @@ -146,8 +156,9 @@ static result_t compress_cctx_compress( return result_error(result_error_skip); ZSTD_CCtx* cctx = ZSTD_createCCtx(); - if (cctx == NULL) { - fprintf(stderr, "ZSTD_createCCtx() failed\n"); + ZSTD_DCtx* dctx = ZSTD_createDCtx(); + if (cctx == NULL || dctx == NULL) { + fprintf(stderr, "context creation failed\n"); return result_error(result_error_system_error); } @@ -156,23 +167,45 @@ static result_t compress_cctx_compress( for (size_t i = 0; i < state->inputs.size; ++i) { data_buffer_t const input = state->inputs.buffers[i]; - state->compressed.size = ZSTD_compressCCtx( - cctx, - state->compressed.data, - state->compressed.capacity, - input.data, - input.size, - level); + if (config->use_dictionary) + state->compressed.size = ZSTD_compress_usingDict( + cctx, + state->compressed.data, + state->compressed.capacity, + input.data, + input.size, + state->dictionary.data, + state->dictionary.size, + level); + else + state->compressed.size = ZSTD_compressCCtx( + cctx, + state->compressed.data, + state->compressed.capacity, + input.data, + input.size, + level); if (ZSTD_isError(state->compressed.size)) { result = result_error(result_error_compression_error); goto out; } - state->decompressed.size = ZSTD_decompress( - state->decompressed.data, - state->decompressed.capacity, - state->compressed.data, - state->compressed.size); + if (config->use_dictionary) + state->decompressed.size = ZSTD_decompress_usingDict( + dctx, + state->decompressed.data, + state->decompressed.capacity, + state->compressed.data, + state->compressed.size, + state->dictionary.data, + state->dictionary.size); + else + state->decompressed.size = ZSTD_decompressDCtx( + dctx, + state->decompressed.data, + state->decompressed.capacity, + state->compressed.data, + state->compressed.size); if (ZSTD_isError(state->decompressed.size)) { result = result_error(result_error_decompression_error); goto out; @@ -188,6 +221,7 @@ static result_t compress_cctx_compress( result = result_data(data); out: ZSTD_freeCCtx(cctx); + ZSTD_freeDCtx(dctx); return result; } @@ -204,9 +238,7 @@ static void method_state_destroy(method_state_t* state) { free(state); } -static result_t cli_compress( - method_state_t* state, - config_t const* config) { +static result_t cli_compress(method_state_t* state, config_t const* config) { if (config->cli_args == NULL) return result_error(result_error_skip); @@ -257,20 +289,250 @@ static result_t cli_compress( return result_data(data); } +static int advanced_config( + ZSTD_CCtx* cctx, + buffer_state_t* state, + config_t const* config) { + ZSTD_CCtx_reset(cctx, ZSTD_reset_session_and_parameters); + for (size_t p = 0; p < config->param_values.size; ++p) { + param_value_t const pv = config->param_values.data[p]; + if (ZSTD_isError(ZSTD_CCtx_setParameter(cctx, pv.param, pv.value))) { + return 1; + } + } + if (config->use_dictionary) { + if (ZSTD_isError(ZSTD_CCtx_loadDictionary( + cctx, state->dictionary.data, state->dictionary.size))) { + return 1; + } + } + return 0; +} + +static result_t advanced_one_pass_compress_output_adjustment( + method_state_t* base, + config_t const* config, + size_t const subtract) { + buffer_state_t* state = container_of(base, buffer_state_t, base); + + if (buffer_state_bad(state, config)) + return result_error(result_error_system_error); + + ZSTD_CCtx* cctx = ZSTD_createCCtx(); + result_t result; + + if (!cctx || advanced_config(cctx, state, config)) { + result = result_error(result_error_compression_error); + goto out; + } + + result_data_t data = {.total_size = 0}; + for (size_t i = 0; i < state->inputs.size; ++i) { + data_buffer_t const input = state->inputs.buffers[i]; + + if (!config->no_pledged_src_size) { + if (ZSTD_isError(ZSTD_CCtx_setPledgedSrcSize(cctx, input.size))) { + result = result_error(result_error_compression_error); + goto out; + } + } + size_t const size = ZSTD_compress2( + cctx, + state->compressed.data, + ZSTD_compressBound(input.size) - subtract, + input.data, + input.size); + if (ZSTD_isError(size)) { + result = result_error(result_error_compression_error); + goto out; + } + data.total_size += size; + } + + result = result_data(data); +out: + ZSTD_freeCCtx(cctx); + return result; +} + +static result_t advanced_one_pass_compress( + method_state_t* base, + config_t const* config) { + return advanced_one_pass_compress_output_adjustment(base, config, 0); +} + +static result_t advanced_one_pass_compress_small_output( + method_state_t* base, + config_t const* config) { + return advanced_one_pass_compress_output_adjustment(base, config, 1); +} + +static result_t advanced_streaming_compress( + method_state_t* base, + config_t const* config) { + buffer_state_t* state = container_of(base, buffer_state_t, base); + + if (buffer_state_bad(state, config)) + return result_error(result_error_system_error); + + ZSTD_CCtx* cctx = ZSTD_createCCtx(); + result_t result; + + if (!cctx || advanced_config(cctx, state, config)) { + result = result_error(result_error_compression_error); + goto out; + } + + result_data_t data = {.total_size = 0}; + for (size_t i = 0; i < state->inputs.size; ++i) { + data_buffer_t input = state->inputs.buffers[i]; + + if (!config->no_pledged_src_size) { + if (ZSTD_isError(ZSTD_CCtx_setPledgedSrcSize(cctx, input.size))) { + result = result_error(result_error_compression_error); + goto out; + } + } + + while (input.size > 0) { + ZSTD_inBuffer in = {input.data, MIN(input.size, 4096)}; + input.data += in.size; + input.size -= in.size; + ZSTD_EndDirective const op = + input.size > 0 ? ZSTD_e_continue : ZSTD_e_end; + size_t ret = 0; + while (in.pos < in.size || (op == ZSTD_e_end && ret != 0)) { + ZSTD_outBuffer out = {state->compressed.data, + MIN(state->compressed.capacity, 1024)}; + ret = ZSTD_compressStream2(cctx, &out, &in, op); + if (ZSTD_isError(ret)) { + result = result_error(result_error_compression_error); + goto out; + } + data.total_size += out.pos; + } + } + } + + result = result_data(data); +out: + ZSTD_freeCCtx(cctx); + return result; +} + +static result_t old_streaming_compress( + method_state_t* base, + config_t const* config) { + buffer_state_t* state = container_of(base, buffer_state_t, base); + + if (buffer_state_bad(state, config)) + return result_error(result_error_system_error); + + int const level = config_get_level(config); + if (level == CONFIG_NO_LEVEL) + return result_error(result_error_skip); + + ZSTD_CStream* zcs = ZSTD_createCStream(); + result_t result; + if (zcs == NULL) { + result = result_error(result_error_compression_error); + goto out; + } + size_t zret; + if (config->use_dictionary) { + zret = ZSTD_initCStream_usingDict( + zcs, state->dictionary.data, state->dictionary.size, level); + } else { + zret = ZSTD_initCStream(zcs, level); + } + if (ZSTD_isError(zret)) { + result = result_error(result_error_compression_error); + goto out; + } + + result_data_t data = {.total_size = 0}; + for (size_t i = 0; i < state->inputs.size; ++i) { + data_buffer_t input = state->inputs.buffers[i]; + zret = ZSTD_resetCStream( + zcs, + config->no_pledged_src_size ? ZSTD_CONTENTSIZE_UNKNOWN + : input.size); + if (ZSTD_isError(zret)) { + result = result_error(result_error_compression_error); + goto out; + } + + while (input.size > 0) { + ZSTD_inBuffer in = {input.data, MIN(input.size, 4096)}; + input.data += in.size; + input.size -= in.size; + ZSTD_EndDirective const op = + input.size > 0 ? ZSTD_e_continue : ZSTD_e_end; + zret = 0; + while (in.pos < in.size || (op == ZSTD_e_end && zret != 0)) { + ZSTD_outBuffer out = {state->compressed.data, + MIN(state->compressed.capacity, 1024)}; + if (op == ZSTD_e_continue || in.pos < in.size) + zret = ZSTD_compressStream(zcs, &out, &in); + else + zret = ZSTD_endStream(zcs, &out); + if (ZSTD_isError(zret)) { + result = result_error(result_error_compression_error); + goto out; + } + data.total_size += out.pos; + } + } + } + + result = result_data(data); +out: + ZSTD_freeCStream(zcs); + return result; +} + method_t const simple = { - .name = "ZSTD_compress", + .name = "compress simple", .create = buffer_state_create, .compress = simple_compress, .destroy = buffer_state_destroy, }; method_t const compress_cctx = { - .name = "ZSTD_compressCCtx", + .name = "compress cctx", .create = buffer_state_create, .compress = compress_cctx_compress, .destroy = buffer_state_destroy, }; +method_t const advanced_one_pass = { + .name = "advanced one pass", + .create = buffer_state_create, + .compress = advanced_one_pass_compress, + .destroy = buffer_state_destroy, +}; + +method_t const advanced_one_pass_small_out = { + .name = "advanced one pass small out", + .create = buffer_state_create, + .compress = advanced_one_pass_compress, + .destroy = buffer_state_destroy, +}; + +method_t const advanced_streaming = { + .name = "advanced streaming", + .create = buffer_state_create, + .compress = advanced_streaming_compress, + .destroy = buffer_state_destroy, +}; + +method_t const old_streaming = { + .name = "old streaming", + .create = buffer_state_create, + .compress = old_streaming_compress, + .destroy = buffer_state_destroy, +}; + method_t const cli = { .name = "zstdcli", .create = method_state_create, @@ -282,6 +544,10 @@ static method_t const* g_methods[] = { &simple, &compress_cctx, &cli, + &advanced_one_pass, + &advanced_one_pass_small_out, + &advanced_streaming, + &old_streaming, NULL, }; diff --git a/tests/regression/results.csv b/tests/regression/results.csv index d9f1873c..3e9d791a 100644 --- a/tests/regression/results.csv +++ b/tests/regression/results.csv @@ -1,101 +1,350 @@ -Data, Config, Method, Total compressed size -This line is intentionally added to see how the nightly job reports failures -silesia.tar, level -5, ZSTD_compress, 7160438 -silesia.tar, level -3, ZSTD_compress, 6789024 -silesia.tar, level -1, ZSTD_compress, 6195462 -silesia.tar, level 0, ZSTD_compress, 4875071 -silesia.tar, level 1, ZSTD_compress, 5339697 -silesia.tar, level 3, ZSTD_compress, 4875071 -silesia.tar, level 4, ZSTD_compress, 4813104 -silesia.tar, level 5, ZSTD_compress, 4726961 -silesia.tar, level 6, ZSTD_compress, 4654401 -silesia.tar, level 7, ZSTD_compress, 4591933 -silesia.tar, level 9, ZSTD_compress, 4554098 -silesia.tar, level 13, ZSTD_compress, 4503496 -silesia.tar, level 16, ZSTD_compress, 4387233 -silesia.tar, level 19, ZSTD_compress, 4283123 -silesia, level -5, ZSTD_compressCCtx, 7152294 -silesia, level -3, ZSTD_compressCCtx, 6789969 -silesia, level -1, ZSTD_compressCCtx, 6191548 -silesia, level 0, ZSTD_compressCCtx, 4862377 -silesia, level 1, ZSTD_compressCCtx, 5318036 -silesia, level 3, ZSTD_compressCCtx, 4862377 -silesia, level 4, ZSTD_compressCCtx, 4800629 -silesia, level 5, ZSTD_compressCCtx, 4715005 -silesia, level 6, ZSTD_compressCCtx, 4644055 -silesia, level 7, ZSTD_compressCCtx, 4581559 -silesia, level 9, ZSTD_compressCCtx, 4543862 -silesia, level 13, ZSTD_compressCCtx, 4493931 -silesia, level 16, ZSTD_compressCCtx, 4381885 -silesia, level 19, ZSTD_compressCCtx, 4296899 -github, level -5, ZSTD_compressCCtx, 232744 -github, level -3, ZSTD_compressCCtx, 220611 -github, level -1, ZSTD_compressCCtx, 176575 -github, level 0, ZSTD_compressCCtx, 136397 -github, level 1, ZSTD_compressCCtx, 143457 -github, level 3, ZSTD_compressCCtx, 136397 -github, level 4, ZSTD_compressCCtx, 136144 -github, level 5, ZSTD_compressCCtx, 135106 -github, level 6, ZSTD_compressCCtx, 135108 -github, level 7, ZSTD_compressCCtx, 135108 -github, level 9, ZSTD_compressCCtx, 135108 -github, level 13, ZSTD_compressCCtx, 133741 -github, level 16, ZSTD_compressCCtx, 133741 -github, level 19, ZSTD_compressCCtx, 133717 -silesia, level -5, zstdcli, 7152342 -silesia, level -3, zstdcli, 6790021 -silesia, level -1, zstdcli, 6191597 -silesia, level 0, zstdcli, 4862425 -silesia, level 1, zstdcli, 5318084 -silesia, level 3, zstdcli, 4862425 -silesia, level 4, zstdcli, 4800677 -silesia, level 5, zstdcli, 4715053 -silesia, level 6, zstdcli, 4644103 -silesia, level 7, zstdcli, 4581607 -silesia, level 9, zstdcli, 4543910 -silesia, level 13, zstdcli, 4493979 -silesia, level 16, zstdcli, 4381933 -silesia, level 19, zstdcli, 4296947 -silesia.tar, level -5, zstdcli, 7159586 -silesia.tar, level -3, zstdcli, 6791018 -silesia.tar, level -1, zstdcli, 6196283 -silesia.tar, level 0, zstdcli, 4876730 -silesia.tar, level 1, zstdcli, 5340312 -silesia.tar, level 3, zstdcli, 4876730 -silesia.tar, level 4, zstdcli, 4817723 -silesia.tar, level 5, zstdcli, 4730389 -silesia.tar, level 6, zstdcli, 4655708 -silesia.tar, level 7, zstdcli, 4593407 -silesia.tar, level 9, zstdcli, 4556135 -silesia.tar, level 13, zstdcli, 4503500 -silesia.tar, level 16, zstdcli, 4387237 -silesia.tar, level 19, zstdcli, 4283127 -silesia.tar, no source size, zstdcli, 4876726 -github, level -5, zstdcli, 234744 -github, level -5 with dict, zstdcli, 47528 -github, level -3, zstdcli, 222611 -github, level -3 with dict, zstdcli, 46394 -github, level -1, zstdcli, 178575 -github, level -1 with dict, zstdcli, 43401 -github, level 0, zstdcli, 138397 -github, level 0 with dict, zstdcli, 40316 -github, level 1, zstdcli, 145457 -github, level 1 with dict, zstdcli, 43242 -github, level 3, zstdcli, 138397 -github, level 3 with dict, zstdcli, 40316 -github, level 4, zstdcli, 138144 -github, level 4 with dict, zstdcli, 40292 -github, level 5, zstdcli, 137106 -github, level 5 with dict, zstdcli, 40938 -github, level 6, zstdcli, 137108 -github, level 6 with dict, zstdcli, 40632 -github, level 7, zstdcli, 137108 -github, level 7 with dict, zstdcli, 40766 -github, level 9, zstdcli, 137108 -github, level 9 with dict, zstdcli, 41326 -github, level 13, zstdcli, 135741 -github, level 13 with dict, zstdcli, 41670 -github, level 16, zstdcli, 135741 -github, level 16 with dict, zstdcli, 39940 -github, level 19, zstdcli, 135717 -github, level 19 with dict, zstdcli, 39576 +Data, Config, Method, Total compressed size +silesia.tar, level -5, compress simple, 7160438 +silesia.tar, level -3, compress simple, 6789024 +silesia.tar, level -1, compress simple, 6195462 +silesia.tar, level 0, compress simple, 4875071 +silesia.tar, level 1, compress simple, 5339697 +silesia.tar, level 3, compress simple, 4875071 +silesia.tar, level 4, compress simple, 4813104 +silesia.tar, level 5, compress simple, 4726961 +silesia.tar, level 6, compress simple, 4654401 +silesia.tar, level 7, compress simple, 4591933 +silesia.tar, level 9, compress simple, 4554098 +silesia.tar, level 13, compress simple, 4503496 +silesia.tar, level 16, compress simple, 4387233 +silesia.tar, level 19, compress simple, 4283123 +silesia, level -5, compress cctx, 7152294 +silesia, level -3, compress cctx, 6789969 +silesia, level -1, compress cctx, 6191548 +silesia, level 0, compress cctx, 4862377 +silesia, level 1, compress cctx, 5318036 +silesia, level 3, compress cctx, 4862377 +silesia, level 4, compress cctx, 4800629 +silesia, level 5, compress cctx, 4715005 +silesia, level 6, compress cctx, 4644055 +silesia, level 7, compress cctx, 4581559 +silesia, level 9, compress cctx, 4543862 +silesia, level 13, compress cctx, 4493931 +silesia, level 16, compress cctx, 4381885 +silesia, level 19, compress cctx, 4296899 +github, level -5, compress cctx, 232744 +github, level -5 with dict, compress cctx, 45704 +github, level -3, compress cctx, 220611 +github, level -3 with dict, compress cctx, 44510 +github, level -1, compress cctx, 176575 +github, level -1 with dict, compress cctx, 41586 +github, level 0, compress cctx, 136397 +github, level 0 with dict, compress cctx, 38700 +github, level 1, compress cctx, 143457 +github, level 1 with dict, compress cctx, 41538 +github, level 3, compress cctx, 136397 +github, level 3 with dict, compress cctx, 38700 +github, level 4, compress cctx, 136144 +github, level 4 with dict, compress cctx, 38639 +github, level 5, compress cctx, 135106 +github, level 5 with dict, compress cctx, 38934 +github, level 6, compress cctx, 135108 +github, level 6 with dict, compress cctx, 38628 +github, level 7, compress cctx, 135108 +github, level 7 with dict, compress cctx, 38741 +github, level 9, compress cctx, 135108 +github, level 9 with dict, compress cctx, 39335 +github, level 13, compress cctx, 133741 +github, level 13 with dict, compress cctx, 39670 +github, level 16, compress cctx, 133741 +github, level 16 with dict, compress cctx, 37928 +github, level 19, compress cctx, 133717 +github, level 19 with dict, compress cctx, 37567 +silesia, level -5, zstdcli, 7152342 +silesia, level -3, zstdcli, 6790021 +silesia, level -1, zstdcli, 6191597 +silesia, level 0, zstdcli, 4862425 +silesia, level 1, zstdcli, 5318084 +silesia, level 3, zstdcli, 4862425 +silesia, level 4, zstdcli, 4800677 +silesia, level 5, zstdcli, 4715053 +silesia, level 6, zstdcli, 4644103 +silesia, level 7, zstdcli, 4581607 +silesia, level 9, zstdcli, 4543910 +silesia, level 13, zstdcli, 4493979 +silesia, level 16, zstdcli, 4381933 +silesia, level 19, zstdcli, 4296947 +silesia.tar, level -5, zstdcli, 7159586 +silesia.tar, level -3, zstdcli, 6791018 +silesia.tar, level -1, zstdcli, 6196283 +silesia.tar, level 0, zstdcli, 4876730 +silesia.tar, level 1, zstdcli, 5340312 +silesia.tar, level 3, zstdcli, 4876730 +silesia.tar, level 4, zstdcli, 4817723 +silesia.tar, level 5, zstdcli, 4730389 +silesia.tar, level 6, zstdcli, 4655708 +silesia.tar, level 7, zstdcli, 4593407 +silesia.tar, level 9, zstdcli, 4556135 +silesia.tar, level 13, zstdcli, 4503500 +silesia.tar, level 16, zstdcli, 4387237 +silesia.tar, level 19, zstdcli, 4283127 +silesia.tar, no source size, zstdcli, 4876726 +github, level -5, zstdcli, 234744 +github, level -5 with dict, zstdcli, 47528 +github, level -3, zstdcli, 222611 +github, level -3 with dict, zstdcli, 46394 +github, level -1, zstdcli, 178575 +github, level -1 with dict, zstdcli, 43401 +github, level 0, zstdcli, 138397 +github, level 0 with dict, zstdcli, 40316 +github, level 1, zstdcli, 145457 +github, level 1 with dict, zstdcli, 43242 +github, level 3, zstdcli, 138397 +github, level 3 with dict, zstdcli, 40316 +github, level 4, zstdcli, 138144 +github, level 4 with dict, zstdcli, 40292 +github, level 5, zstdcli, 137106 +github, level 5 with dict, zstdcli, 40938 +github, level 6, zstdcli, 137108 +github, level 6 with dict, zstdcli, 40632 +github, level 7, zstdcli, 137108 +github, level 7 with dict, zstdcli, 40766 +github, level 9, zstdcli, 137108 +github, level 9 with dict, zstdcli, 41326 +github, level 13, zstdcli, 135741 +github, level 13 with dict, zstdcli, 41670 +github, level 16, zstdcli, 135741 +github, level 16 with dict, zstdcli, 39940 +github, level 19, zstdcli, 135717 +github, level 19 with dict, zstdcli, 39576 +silesia, level -5, advanced one pass, 7152294 +silesia, level -3, advanced one pass, 6789969 +silesia, level -1, advanced one pass, 6191548 +silesia, level 0, advanced one pass, 4862377 +silesia, level 1, advanced one pass, 5318036 +silesia, level 3, advanced one pass, 4862377 +silesia, level 4, advanced one pass, 4800629 +silesia, level 5, advanced one pass, 4715005 +silesia, level 6, advanced one pass, 4644055 +silesia, level 7, advanced one pass, 4581559 +silesia, level 9, advanced one pass, 4543862 +silesia, level 13, advanced one pass, 4493931 +silesia, level 16, advanced one pass, 4381885 +silesia, level 19, advanced one pass, 4296899 +silesia, no source size, advanced one pass, 4862377 +silesia.tar, level -5, advanced one pass, 7160438 +silesia.tar, level -3, advanced one pass, 6789024 +silesia.tar, level -1, advanced one pass, 6195462 +silesia.tar, level 0, advanced one pass, 4875071 +silesia.tar, level 1, advanced one pass, 5339697 +silesia.tar, level 3, advanced one pass, 4875071 +silesia.tar, level 4, advanced one pass, 4813104 +silesia.tar, level 5, advanced one pass, 4726961 +silesia.tar, level 6, advanced one pass, 4654401 +silesia.tar, level 7, advanced one pass, 4591933 +silesia.tar, level 9, advanced one pass, 4554098 +silesia.tar, level 13, advanced one pass, 4503496 +silesia.tar, level 16, advanced one pass, 4387233 +silesia.tar, level 19, advanced one pass, 4283123 +silesia.tar, no source size, advanced one pass, 4875071 +github, level -5, advanced one pass, 232744 +github, level -5 with dict, advanced one pass, 45528 +github, level -3, advanced one pass, 220611 +github, level -3 with dict, advanced one pass, 44394 +github, level -1, advanced one pass, 176575 +github, level -1 with dict, advanced one pass, 41401 +github, level 0, advanced one pass, 136397 +github, level 0 with dict, advanced one pass, 38316 +github, level 1, advanced one pass, 143457 +github, level 1 with dict, advanced one pass, 41242 +github, level 3, advanced one pass, 136397 +github, level 3 with dict, advanced one pass, 38316 +github, level 4, advanced one pass, 136144 +github, level 4 with dict, advanced one pass, 38292 +github, level 5, advanced one pass, 135106 +github, level 5 with dict, advanced one pass, 38938 +github, level 6, advanced one pass, 135108 +github, level 6 with dict, advanced one pass, 38632 +github, level 7, advanced one pass, 135108 +github, level 7 with dict, advanced one pass, 38766 +github, level 9, advanced one pass, 135108 +github, level 9 with dict, advanced one pass, 39326 +github, level 13, advanced one pass, 133741 +github, level 13 with dict, advanced one pass, 39670 +github, level 16, advanced one pass, 133741 +github, level 16 with dict, advanced one pass, 37940 +github, level 19, advanced one pass, 133717 +github, level 19 with dict, advanced one pass, 37576 +github, no source size, advanced one pass, 136397 +silesia, level -5, advanced one pass small out, 7152294 +silesia, level -3, advanced one pass small out, 6789969 +silesia, level -1, advanced one pass small out, 6191548 +silesia, level 0, advanced one pass small out, 4862377 +silesia, level 1, advanced one pass small out, 5318036 +silesia, level 3, advanced one pass small out, 4862377 +silesia, level 4, advanced one pass small out, 4800629 +silesia, level 5, advanced one pass small out, 4715005 +silesia, level 6, advanced one pass small out, 4644055 +silesia, level 7, advanced one pass small out, 4581559 +silesia, level 9, advanced one pass small out, 4543862 +silesia, level 13, advanced one pass small out, 4493931 +silesia, level 16, advanced one pass small out, 4381885 +silesia, level 19, advanced one pass small out, 4296899 +silesia, no source size, advanced one pass small out, 4862377 +silesia.tar, level -5, advanced one pass small out, 7160438 +silesia.tar, level -3, advanced one pass small out, 6789024 +silesia.tar, level -1, advanced one pass small out, 6195462 +silesia.tar, level 0, advanced one pass small out, 4875071 +silesia.tar, level 1, advanced one pass small out, 5339697 +silesia.tar, level 3, advanced one pass small out, 4875071 +silesia.tar, level 4, advanced one pass small out, 4813104 +silesia.tar, level 5, advanced one pass small out, 4726961 +silesia.tar, level 6, advanced one pass small out, 4654401 +silesia.tar, level 7, advanced one pass small out, 4591933 +silesia.tar, level 9, advanced one pass small out, 4554098 +silesia.tar, level 13, advanced one pass small out, 4503496 +silesia.tar, level 16, advanced one pass small out, 4387233 +silesia.tar, level 19, advanced one pass small out, 4283123 +silesia.tar, no source size, advanced one pass small out, 4875071 +github, level -5, advanced one pass small out, 232744 +github, level -5 with dict, advanced one pass small out, 45528 +github, level -3, advanced one pass small out, 220611 +github, level -3 with dict, advanced one pass small out, 44394 +github, level -1, advanced one pass small out, 176575 +github, level -1 with dict, advanced one pass small out, 41401 +github, level 0, advanced one pass small out, 136397 +github, level 0 with dict, advanced one pass small out, 38316 +github, level 1, advanced one pass small out, 143457 +github, level 1 with dict, advanced one pass small out, 41242 +github, level 3, advanced one pass small out, 136397 +github, level 3 with dict, advanced one pass small out, 38316 +github, level 4, advanced one pass small out, 136144 +github, level 4 with dict, advanced one pass small out, 38292 +github, level 5, advanced one pass small out, 135106 +github, level 5 with dict, advanced one pass small out, 38938 +github, level 6, advanced one pass small out, 135108 +github, level 6 with dict, advanced one pass small out, 38632 +github, level 7, advanced one pass small out, 135108 +github, level 7 with dict, advanced one pass small out, 38766 +github, level 9, advanced one pass small out, 135108 +github, level 9 with dict, advanced one pass small out, 39326 +github, level 13, advanced one pass small out, 133741 +github, level 13 with dict, advanced one pass small out, 39670 +github, level 16, advanced one pass small out, 133741 +github, level 16 with dict, advanced one pass small out, 37940 +github, level 19, advanced one pass small out, 133717 +github, level 19 with dict, advanced one pass small out, 37576 +github, no source size, advanced one pass small out, 136397 +silesia, level -5, advanced streaming, 7152294 +silesia, level -3, advanced streaming, 6789973 +silesia, level -1, advanced streaming, 6191549 +silesia, level 0, advanced streaming, 4862377 +silesia, level 1, advanced streaming, 5318036 +silesia, level 3, advanced streaming, 4862377 +silesia, level 4, advanced streaming, 4800629 +silesia, level 5, advanced streaming, 4715005 +silesia, level 6, advanced streaming, 4644055 +silesia, level 7, advanced streaming, 4581559 +silesia, level 9, advanced streaming, 4543862 +silesia, level 13, advanced streaming, 4493931 +silesia, level 16, advanced streaming, 4381885 +silesia, level 19, advanced streaming, 4296899 +silesia, no source size, advanced streaming, 4862341 +silesia.tar, level -5, advanced streaming, 7160440 +silesia.tar, level -3, advanced streaming, 6789026 +silesia.tar, level -1, advanced streaming, 6195465 +silesia.tar, level 0, advanced streaming, 4875071 +silesia.tar, level 1, advanced streaming, 5339701 +silesia.tar, level 3, advanced streaming, 4875071 +silesia.tar, level 4, advanced streaming, 4813104 +silesia.tar, level 5, advanced streaming, 4726977 +silesia.tar, level 6, advanced streaming, 4654404 +silesia.tar, level 7, advanced streaming, 4591934 +silesia.tar, level 9, advanced streaming, 4554105 +silesia.tar, level 13, advanced streaming, 4503496 +silesia.tar, level 16, advanced streaming, 4387233 +silesia.tar, level 19, advanced streaming, 4283123 +silesia.tar, no source size, advanced streaming, 4875067 +github, level -5, advanced streaming, 232744 +github, level -5 with dict, advanced streaming, 45528 +github, level -3, advanced streaming, 220611 +github, level -3 with dict, advanced streaming, 44394 +github, level -1, advanced streaming, 176575 +github, level -1 with dict, advanced streaming, 41401 +github, level 0, advanced streaming, 136397 +github, level 0 with dict, advanced streaming, 38316 +github, level 1, advanced streaming, 143457 +github, level 1 with dict, advanced streaming, 41242 +github, level 3, advanced streaming, 136397 +github, level 3 with dict, advanced streaming, 38316 +github, level 4, advanced streaming, 136144 +github, level 4 with dict, advanced streaming, 38292 +github, level 5, advanced streaming, 135106 +github, level 5 with dict, advanced streaming, 38938 +github, level 6, advanced streaming, 135108 +github, level 6 with dict, advanced streaming, 38632 +github, level 7, advanced streaming, 135108 +github, level 7 with dict, advanced streaming, 38766 +github, level 9, advanced streaming, 135108 +github, level 9 with dict, advanced streaming, 39326 +github, level 13, advanced streaming, 133741 +github, level 13 with dict, advanced streaming, 39670 +github, level 16, advanced streaming, 133741 +github, level 16 with dict, advanced streaming, 37940 +github, level 19, advanced streaming, 133717 +github, level 19 with dict, advanced streaming, 37576 +github, no source size, advanced streaming, 136397 +silesia, level -5, old streaming, 7152294 +silesia, level -3, old streaming, 6789973 +silesia, level -1, old streaming, 6191549 +silesia, level 0, old streaming, 4862377 +silesia, level 1, old streaming, 5318036 +silesia, level 3, old streaming, 4862377 +silesia, level 4, old streaming, 4800629 +silesia, level 5, old streaming, 4715005 +silesia, level 6, old streaming, 4644055 +silesia, level 7, old streaming, 4581559 +silesia, level 9, old streaming, 4543862 +silesia, level 13, old streaming, 4493931 +silesia, level 16, old streaming, 4381885 +silesia, level 19, old streaming, 4296899 +silesia, no source size, old streaming, 4862341 +silesia.tar, level -5, old streaming, 7160440 +silesia.tar, level -3, old streaming, 6789026 +silesia.tar, level -1, old streaming, 6195465 +silesia.tar, level 0, old streaming, 4875071 +silesia.tar, level 1, old streaming, 5339701 +silesia.tar, level 3, old streaming, 4875071 +silesia.tar, level 4, old streaming, 4813104 +silesia.tar, level 5, old streaming, 4726977 +silesia.tar, level 6, old streaming, 4654404 +silesia.tar, level 7, old streaming, 4591934 +silesia.tar, level 9, old streaming, 4554105 +silesia.tar, level 13, old streaming, 4503496 +silesia.tar, level 16, old streaming, 4387233 +silesia.tar, level 19, old streaming, 4283123 +silesia.tar, no source size, old streaming, 4875067 +github, level -5, old streaming, 232744 +github, level -5 with dict, old streaming, 45528 +github, level -3, old streaming, 220611 +github, level -3 with dict, old streaming, 44394 +github, level -1, old streaming, 176575 +github, level -1 with dict, old streaming, 41401 +github, level 0, old streaming, 136397 +github, level 0 with dict, old streaming, 38316 +github, level 1, old streaming, 143457 +github, level 1 with dict, old streaming, 41242 +github, level 3, old streaming, 136397 +github, level 3 with dict, old streaming, 38316 +github, level 4, old streaming, 136144 +github, level 4 with dict, old streaming, 38292 +github, level 5, old streaming, 135106 +github, level 5 with dict, old streaming, 38938 +github, level 6, old streaming, 135108 +github, level 6 with dict, old streaming, 38632 +github, level 7, old streaming, 135108 +github, level 7 with dict, old streaming, 38766 +github, level 9, old streaming, 135108 +github, level 9 with dict, old streaming, 39326 +github, level 13, old streaming, 133741 +github, level 13 with dict, old streaming, 39670 +github, level 16, old streaming, 133741 +github, level 16 with dict, old streaming, 37940 +github, level 19, old streaming, 133717 +github, level 19 with dict, old streaming, 37576 +github, no source size, old streaming, 141003