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@fys.uio.no)
Acked-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Joachim B Haga 2006-07-03 22:11:47 +02:00 committed by Junio C Hamano
parent 8fced61cbc
commit 12f6c308d5
8 changed files with 23 additions and 5 deletions

View File

@ -91,6 +91,12 @@ core.warnAmbiguousRefs::
If true, git will warn you if the ref name you passed it is ambiguous 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. 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.*:: alias.*::
Command aliases for the gitlink:git[1] command wrapper - e.g. Command aliases for the gitlink:git[1] command wrapper - e.g.
after defining "alias.last = cat-file commit HEAD", the invocation after defining "alias.last = cat-file commit HEAD", the invocation

View File

@ -183,6 +183,7 @@ extern int log_all_ref_updates;
extern int warn_ambiguous_refs; extern int warn_ambiguous_refs;
extern int shared_repository; extern int shared_repository;
extern const char *apply_default_whitespace; extern const char *apply_default_whitespace;
extern int zlib_compression_level;
#define GIT_REPO_VERSION 0 #define GIT_REPO_VERSION 0
extern int repository_format_version; extern int repository_format_version;

View File

@ -279,6 +279,16 @@ int git_default_config(const char *var, const char *value)
return 0; 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")) { if (!strcmp(var, "user.name")) {
strlcpy(git_default_name, value, sizeof(git_default_name)); strlcpy(git_default_name, value, sizeof(git_default_name));
return 0; return 0;

View File

@ -122,7 +122,7 @@ int sha1write_compressed(struct sha1file *f, void *in, unsigned int size)
void *out; void *out;
memset(&stream, 0, sizeof(stream)); memset(&stream, 0, sizeof(stream));
deflateInit(&stream, Z_DEFAULT_COMPRESSION); deflateInit(&stream, zlib_compression_level);
maxsize = deflateBound(&stream, size); maxsize = deflateBound(&stream, size);
out = xmalloc(maxsize); out = xmalloc(maxsize);

2
diff.c
View File

@ -583,7 +583,7 @@ static unsigned char *deflate_it(char *data,
z_stream stream; z_stream stream;
memset(&stream, 0, sizeof(stream)); memset(&stream, 0, sizeof(stream));
deflateInit(&stream, Z_BEST_COMPRESSION); deflateInit(&stream, zlib_compression_level);
bound = deflateBound(&stream, size); bound = deflateBound(&stream, size);
deflated = xmalloc(bound); deflated = xmalloc(bound);
stream.next_out = deflated; stream.next_out = deflated;

View File

@ -20,6 +20,7 @@ int repository_format_version = 0;
char git_commit_encoding[MAX_ENCODING_LENGTH] = "utf-8"; char git_commit_encoding[MAX_ENCODING_LENGTH] = "utf-8";
int shared_repository = PERM_UMASK; int shared_repository = PERM_UMASK;
const char *apply_default_whitespace = NULL; 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, static char *git_dir, *git_object_dir, *git_index_file, *git_refs_dir,
*git_graft_file; *git_graft_file;

View File

@ -492,7 +492,7 @@ static void start_put(struct transfer_request *request)
/* Set it up */ /* Set it up */
memset(&stream, 0, sizeof(stream)); memset(&stream, 0, sizeof(stream));
deflateInit(&stream, Z_BEST_COMPRESSION); deflateInit(&stream, zlib_compression_level);
size = deflateBound(&stream, len + hdrlen); size = deflateBound(&stream, len + hdrlen);
request->buffer.buffer = xmalloc(size); request->buffer.buffer = xmalloc(size);

View File

@ -1458,7 +1458,7 @@ int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned cha
/* Set it up */ /* Set it up */
memset(&stream, 0, sizeof(stream)); memset(&stream, 0, sizeof(stream));
deflateInit(&stream, Z_BEST_COMPRESSION); deflateInit(&stream, zlib_compression_level);
size = deflateBound(&stream, len+hdrlen); size = deflateBound(&stream, len+hdrlen);
compressed = xmalloc(size); compressed = xmalloc(size);
@ -1511,7 +1511,7 @@ static void *repack_object(const unsigned char *sha1, unsigned long *objsize)
/* Set it up */ /* Set it up */
memset(&stream, 0, sizeof(stream)); memset(&stream, 0, sizeof(stream));
deflateInit(&stream, Z_BEST_COMPRESSION); deflateInit(&stream, zlib_compression_level);
size = deflateBound(&stream, len + hdrlen); size = deflateBound(&stream, len + hdrlen);
buf = xmalloc(size); buf = xmalloc(size);