Re: [PATCH] write-tree performance problems
- From
Linus Torvalds <torvalds@osdl.org>
- Date
- Apr 20, 2005, 15:40 UTC
- Message-ID
- <Pine.LNX.4.58.0504200833580.6467@ppc970.osdl.org>
- In-Reply-To
- <200504201122.35448.mason@suse.com>
On Wed, 20 Apr 2005, Chris Mason wrote:
> > Thanks for looking at this. Your new tree is faster, it gets the commit 100 > patches time down from 1m5s to 50s.
It really _shouldn't_ be faster. It still does the compression, and throws the end result away.
To actually go faster, it _should_ need this patch. Untested. See if it works..
Linus --- sha1_file.c: 40c00b77d0e52b31dda1696f10026fe6f92bc082
--- a/sha1_file.c +++ b/sha1_file.c @@ -173,12 +173,27 @@ int write_sha1_file(char *buf, unsigned z_stream stream; unsigned char sha1[20]; SHA_CTX c; + char *filename; + int fd; /* Sha1.. */ SHA1_Init(&c); SHA1_Update(&c, buf, len); SHA1_Final(sha1, &c); + filename = sha1_file_name(sha1); + fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0666); + if (fd < 0) { + if (errno != EEXIST) + return -1; + + /* + * We might do collision checking here, but we'd need to + * uncompress the old file and check it. Later. + */ + return 0; + } + /* Set it up */ memset(&stream, 0, sizeof(stream)); deflateInit(&stream, Z_BEST_COMPRESSION); @@ -195,8 +210,10 @@ int write_sha1_file(char *buf, unsigned deflateEnd(&stream); size = stream.total_out; - if (write_sha1_buffer(sha1, compressed, size) < 0) - return -1; + if (write(fd, compressed, size) != size) + die("unable to write file"); + close(fd); + if (returnsha1) memcpy(returnsha1, sha1, 20); return 0;