diff options
author | Russell Belfer <rb@github.com> | 2012-05-17 13:06:20 -0700 |
---|---|---|
committer | Russell Belfer <rb@github.com> | 2012-05-17 13:06:20 -0700 |
commit | b59c73d39a0bb3ddb6fd4e81f796018c2b3a0579 (patch) | |
tree | 27e61863405c09e510fe9d419a19366b20353cf9 /src/buffer.c | |
parent | 706a9974a297ea1b38c6aab886b54598409725e8 (diff) | |
download | libgit2-b59c73d39a0bb3ddb6fd4e81f796018c2b3a0579.tar.gz |
Optimize away git_text_gather_stats in diff
GProf shows `git_text_gather_stats` as the most expensive call
in large diffs. The function calculates a lot of information
that is not actually used and does not do so in a optimal
order. This introduces a tuned `git_buf_is_binary` function
that executes the same algorithm in a fraction of the time.
Diffstat (limited to 'src/buffer.c')
-rw-r--r-- | src/buffer.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/buffer.c b/src/buffer.c index ef95839f6..29aaf3fec 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -445,3 +445,21 @@ int git_buf_common_prefix(git_buf *buf, const git_strarray *strings) return 0; } + +bool git_buf_is_binary(const git_buf *buf) +{ + int i, printable = 0, nonprintable = 0; + + for (i = 0; i < buf->size; i++) { + unsigned char c = buf->ptr[i]; + if (c > 0x1F && c < 0x7f) + printable++; + else if (c == '\0') + return true; + else if (!git__isspace(c)) + nonprintable++; + } + + return ((printable >> 7) < nonprintable); +} + |