From: Rafael Silva <rafaeloliveira.cs@gmail.com>
To: git@vger.kernel.org
Cc: Stefan Beller <stefanbeller@gmail.com>,
Junio C Hamano <gitster@pobox.com>,
Rafael Silva <rafaeloliveira.cs@gmail.com>
Subject: [PATCH 0/1] blame: remove unnecessary use of get_commit_info()
Date: Tue, 16 Feb 2021 17:31:50 +0100 [thread overview]
Message-ID: <20210216163151.76307-1-rafaeloliveira.cs@gmail.com> (raw)
This patch is a code cleanup and consequently a micro optimization in
determine_heat_line().
When `blame`ing with --color-by-age, the determine_line_heat() calls the
get_commit_info() to parse the commit's information. However, it turns
out this is actually unnecessary because its caller also does the same.
We can instead, pass the already parsed `commit_info` and remove the
internal call to get_commit_info().
The performance optimization made by this patch is relatively small as
get_commit_info() doesn't perform any heavy-load operations. So, the
performance improvements is not that exciting, not at least until you
enter the ms/μs realm. Nevertheless I thought the code cleanup is
still valid and the optimization is a bonus.
... digging into the the performance improvements, for those
who are curious ...
Running Git PERF suite in linux.git, I've got a subtle performance
improvement for some runs:
# git.328c109303 - compiled git from commit 328c109303
# git.blame-patched - compiled git from commit 328c109303 + this patch
Test git.328c109303 git.blame-patched
-------------------------------------------------------------------------------------
blame --color-by-age kernel/fork.c 1.96(1.81+0.15) 1.95(1.80+0.14) -0.5%
blame --color-by-age kernel/sys.c 1.67(1.53+0.13) 1.66(1.52+0.14) -0.6%
blame --color-by-age mm/slab.c 2.16(2.00+0.16) 2.15(1.99+0.15) -0.5%
blame --color-by-age lib/packing.c 0.20(0.14+0.05) 0.20(0.14+0.05) +0.0%
blame --color-by-age drivers/cdrom/cdrom.c 1.62(1.46+0.15) 1.62(1.46+0.15) +0.0%
blame --color-by-age crypto/crypto_engine.c 0.37(0.29+0.06) 0.36(0.28+0.06) -2.7%
blame --color-by-age net/ipv4/ip_forward.c 1.49(1.35+0.13) 1.48(1.34+0.13) -0.7%
To dig a little deeper, I enabled the Git's trace2 API to record every
call to the determine_line_heat() function:
...
+ trace2_region_enter("blame", "determine_line_heat", the_repository);
determine_line_heat(ent, &default_color);
+ trace2_region_enter("blame", "determine_line_heat", the_repository);
...
Then, running `blame` for "kernel/fork.c` and _summing_ all the execution
time for every call (around 1.3k calls) resulted in 2.6x faster execution
(best out 3):
git built from 328c109303 (The eighth batch, 2021-02-12) = 42ms
git built from 328c109303 + this patch = 16ms
Of course, this is on the milliseconds :).
Lastly, to get a better picture of the performance change, I computed
all the determine_line_heat()'s execution time, for all 3 calls, into
a distribution graph. The execution time is converted to microseconds
for ease of understanding:
# git built from 328c109303 (The eighth batch, 2021-02-12)
Time in μs 0.0 ~ 9.0 |
Time in μs 10.0 ~ 19.0 | *
Time in μs 20.0 ~ 29.0 | *****************
Time in μs 30.0 ~ 39.0 | *****************
Time in μs 40.0 ~ 49.0 | **
Time in μs 50.0 ~ 59.0 | *
Time in μs 60.0 ~ 69.0 | *
Time in μs 70.0 ~ 79.0 | *
Time in μs 80.0 ~ 89.0 | *
Time in μs 90.0 ~ 99.0 | *
Time in μs 100.0 ~ 109.0 | *
Time in μs 110.0 ~ 119.0 | *
Time in μs 120.0 ~ 129.0 |
Time in μs 130.0 ~ 139.0 | *
[N: 3915 | Median: 30.0 | Min: 19.0 | Max: 137.0]
# git built from 328c109303 + this patch
Time in μs 0.0 ~ 9.0 |
Time in μs 10.0 ~ 19.0 | *************************************
Time in μs 20.0 ~ 29.0 | *
Time in μs 30.0 ~ 39.0 | *
Time in μs 40.0 ~ 49.0 | *
Time in μs 50.0 ~ 59.0 | *
Time in μs 60.0 ~ 69.0 | *
Time in μs 70.0 ~ 79.0 | *
Time in μs 80.0 ~ 89.0 | *
Time in μs 90.0 ~ 99.0 |
... [ zero's omitted ] ...
Time in μs 150.0 ~ 159.0 |
Time in μs 160.0 ~ 169.0 | *
[N: 3915 | Median: 12.0 | Min: 10.0 | Max: 167.0]
Note: A "*" represent hundreds counter. One "*" is used
for any count between 1 and 99. (i.e: 23 = "*", 99 = "*",
100 = "**", 199 = "**", 200 = "***", etc).
With the changes introduced by this patch, the determine_line_heat()
mostly finishes its execution between 10μs and 19μs compared with the
current implementation that mostly finished around 20μs and 39μs.
Rafael Silva (1):
blame: remove unnecessary use of get_commit_info()
builtin/blame.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
--
2.30.1.842.gf6373b1729
next reply other threads:[~2021-02-16 16:33 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-02-16 16:31 Rafael Silva [this message]
2021-02-16 16:31 ` [PATCH 1/1] blame: remove unnecessary use of get_commit_info() Rafael Silva
2021-02-16 17:10 ` Taylor Blau
2021-02-16 22:25 ` Rafael Silva
2021-02-16 18:35 ` [PATCH 0/1] " Derrick Stolee
2021-02-16 19:45 ` Junio C Hamano
2021-02-17 14:42 ` Rafael Silva
2021-02-17 14:54 ` [PATCH v2 " Rafael Silva
2021-02-17 14:54 ` [PATCH v2 1/1] " Rafael Silva
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210216163151.76307-1-rafaeloliveira.cs@gmail.com \
--to=rafaeloliveira.cs@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=stefanbeller@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).