Skip to content

Commit

Permalink
Remove preemptive allocations.
Browse files Browse the repository at this point in the history
Careful profiling shows that we spend more time guessing what pattern
allocation will have, whereas we can delay it only at the point where
add_rfc2047 will be used and don't allocate huge memory area for the many
cases where it's not.

Signed-off-by: Pierre Habouzit <madcoder@debian.org>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Pierre Habouzit authored and Junio C Hamano committed Sep 17, 2007
1 parent a08f23a commit 8b6087f
Showing 1 changed file with 5 additions and 30 deletions.
35 changes: 5 additions & 30 deletions commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -501,6 +501,7 @@ static void add_rfc2047(struct strbuf *sb, const char *line, int len,
return;

needquote:
strbuf_grow(sb, len * 3 + strlen(encoding) + 100);
strbuf_addf(sb, "=?%s?q?", encoding);
for (i = last = 0; i < len; i++) {
unsigned ch = line[i] & 0xFF;
Expand All @@ -520,14 +521,6 @@ static void add_rfc2047(struct strbuf *sb, const char *line, int len,
strbuf_addstr(sb, "?=");
}

static unsigned long bound_rfc2047(unsigned long len, const char *encoding)
{
/* upper bound of q encoded string of length 'len' */
unsigned long elen = strlen(encoding);

return len * 3 + elen + 100;
}

static void add_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb,
const char *line, enum date_mode dmode,
const char *encoding)
Expand Down Expand Up @@ -560,8 +553,7 @@ static void add_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb
add_rfc2047(sb, line, display_name_length, encoding);
strbuf_add(sb, name_tail, namelen - display_name_length);
strbuf_addch(sb, '\n');
}
else {
} else {
strbuf_addf(sb, "%s: %.*s%.*s\n", what,
(fmt == CMIT_FMT_FULLER) ? 4 : 0,
filler, namelen, line);
Expand Down Expand Up @@ -955,19 +947,12 @@ static void pp_header(enum cmit_fmt fmt,
* FULLER shows both authors and dates.
*/
if (!memcmp(line, "author ", 7)) {
unsigned long len = linelen;
if (fmt == CMIT_FMT_EMAIL)
len = bound_rfc2047(linelen, encoding);
strbuf_grow(sb, len + 80);
strbuf_grow(sb, linelen + 80);
add_user_info("Author", fmt, sb, line + 7, dmode, encoding);
}

if (!memcmp(line, "committer ", 10) &&
(fmt == CMIT_FMT_FULL || fmt == CMIT_FMT_FULLER)) {
unsigned long len = linelen;
if (fmt == CMIT_FMT_EMAIL)
len = bound_rfc2047(linelen, encoding);
strbuf_grow(sb, len + 80);
strbuf_grow(sb, linelen + 80);
add_user_info("Commit", fmt, sb, line + 10, dmode, encoding);
}
}
Expand All @@ -982,7 +967,6 @@ static void pp_title_line(enum cmit_fmt fmt,
int plain_non_ascii)
{
struct strbuf title;
unsigned long len;

strbuf_init(&title, 80);

Expand All @@ -1004,16 +988,7 @@ static void pp_title_line(enum cmit_fmt fmt,
strbuf_add(&title, line, linelen);
}

/* Enough slop for the MIME header and rfc2047 */
len = bound_rfc2047(title.len, encoding) + 1000;
if (subject)
len += strlen(subject);
if (after_subject)
len += strlen(after_subject);
if (encoding)
len += strlen(encoding);

strbuf_grow(sb, title.len + len);
strbuf_grow(sb, title.len + 1024);
if (subject) {
strbuf_addstr(sb, subject);
add_rfc2047(sb, title.buf, title.len, encoding);
Expand Down

0 comments on commit 8b6087f

Please sign in to comment.