Linus Torvalds <torvalds@xxxxxxxx> writes: > [snip suggested improvements] Yes, that would be more... thorough. And, especially for the int zlib_compression_level = Z_DEFAULT_COMPRESSION; line, more self-explanatory, too. So here's an updated patch (replacing the previous) including your suggestions. -j. - Make zlib compression level configurable, and change default. With the change in default, "git add ." on kernel dir is about twice as fast as before, with only minimal (0.5%) change in object size. The speed difference is even more noticeable when committing large files, which is now up to 8 times faster. The configurability is through setting core.compression = [-1..9] which maps to the zlib constants; -1 is the default, 0 is no compression, and 1..9 are various speed/size tradeoffs, 9 being slowest. Signed-off-by: Joachim B Haga (cjhaga@xxxxxxxxxx) --- Documentation/config.txt | 6 ++++++ cache.h | 1 + config.c | 10 ++++++++++ environment.c | 1 + sha1_file.c | 4 ++-- 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index a04c5ad..ac89be7 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -91,6 +91,12 @@ core.warnAmbiguousRefs:: If true, git will warn you if the ref name you passed it is ambiguous and might match multiple refs in the .git/refs/ tree. True by default. +core.compression: + An integer -1..9, indicating the compression level for objects that + are not in a pack file. -1 is the zlib and git default. 0 means no + compression, and 1..9 are various speed/size tradeoffs, 9 being + slowest. + alias.*:: Command aliases for the gitlink:git[1] command wrapper - e.g. after defining "alias.last = cat-file commit HEAD", the invocation diff --git a/cache.h b/cache.h index 8719939..84770bf 100644 --- a/cache.h +++ b/cache.h @@ -183,6 +183,7 @@ extern int log_all_ref_updates; extern int warn_ambiguous_refs; extern int shared_repository; extern const char *apply_default_whitespace; +extern int zlib_compression_level; #define GIT_REPO_VERSION 0 extern int repository_format_version; diff --git a/config.c b/config.c index ec44827..b23f4bf 100644 --- a/config.c +++ b/config.c @@ -279,6 +279,16 @@ int git_default_config(const char *var, return 0; } + if (!strcmp(var, "core.compression")) { + int level = git_config_int(var, value); + if (level == -1) + level = Z_DEFAULT_COMPRESSION; + else if (level < 0 || level > Z_BEST_COMPRESSION) + die("bad zlib compression level %d", level); + zlib_compression_level = level; + return 0; + } + if (!strcmp(var, "user.name")) { strlcpy(git_default_name, value, sizeof(git_default_name)); return 0; diff --git a/environment.c b/environment.c index 3de8eb3..43823ff 100644 --- a/environment.c +++ b/environment.c @@ -20,6 +20,7 @@ int repository_format_version = 0; char git_commit_encoding[MAX_ENCODING_LENGTH] = "utf-8"; int shared_repository = PERM_UMASK; const char *apply_default_whitespace = NULL; +int zlib_compression_level = Z_DEFAULT_COMPRESSION; static char *git_dir, *git_object_dir, *git_index_file, *git_refs_dir, *git_graft_file; diff --git a/sha1_file.c b/sha1_file.c index 8179630..bc35808 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -1458,7 +1458,7 @@ int write_sha1_file(void *buf, unsigned /* Set it up */ memset(&stream, 0, sizeof(stream)); - deflateInit(&stream, Z_BEST_COMPRESSION); + deflateInit(&stream, zlib_compression_level); size = deflateBound(&stream, len+hdrlen); compressed = xmalloc(size); @@ -1511,7 +1511,7 @@ static void *repack_object(const unsigne /* Set it up */ memset(&stream, 0, sizeof(stream)); - deflateInit(&stream, Z_BEST_COMPRESSION); + deflateInit(&stream, zlib_compression_level); size = deflateBound(&stream, len + hdrlen); buf = xmalloc(size); -- 1.4.1.g8fced-dirty - : send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html