From: Junio C Hamano <gitster@pobox.com>
To: "Kristofer Karlsson via GitGitGadget" <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, Derrick Stolee <stolee@gmail.com>,
Kristofer Karlsson <krka@spotify.com>
Subject: Re: [PATCH] commit: remove padding from struct commit
Date: Thu, 12 Nov 2026 11:22:11 -0800 [thread overview]
Message-ID: <xmqqpkw9j1ng.fsf@gitster.g> (raw)
In-Reply-To: <pull.2309.git.1794500044740.gitgitgadget@gmail.com> (Kristofer Karlsson via GitGitGadget's message of "Thu, 12 Nov 2026 16:14:04 +0000")
"Kristofer Karlsson via GitGitGadget" <gitgitgadget@gmail.com>
writes:
> From: Kristofer Karlsson <krka@spotify.com>
>
> On 64-bit platforms, "struct commit" is 80 bytes, 8 of which are
> padding:
> - 4 bytes between .object and .date
> - 4 bytes of tail padding after .index
> ...
> Measuring peak RSS of "git rev-list --all" over an internal monorepo
> with ~4.5 million commits (three runs each):
>
> peak RSS time
> before ~849 MiB 12.8-13.7s
> after ~817 MiB 12.8-13.0s
>
> The ~32 MiB saved is close to the expected 8 bytes * 4.5M commits
> (~34 MiB); running time is unchanged within noise.
>
> Signed-off-by: Kristofer Karlsson <krka@spotify.com>
> ---
> I also prototyped a regression test that compares the size of "struct
> commit" and "struct object" against the sum of their members' sizes,
> plus any expected padding. I left it out of this patch because I am not
> sure whether:
>
> 1. such a test is worth the cost of updating it whenever members are
> added or removed, or
>
> 2. a unit test is the right place for it.
>
> I am happy to send it as a follow-up if there is interest.
The comment before this structure says ...
> diff --git a/commit.h b/commit.h
> index 1061ed791b..66a5d245f2 100644
> --- a/commit.h
> +++ b/commit.h
> @@ -26,6 +26,7 @@ struct commit_list {
> */
/*
* The size of this struct matters in full repo walk operations like
* 'git clone' or 'git gc'. Consider using commit-slab to attach data
* to a commit instead of adding new fields here.
*/
but apparently it did not have much effect to prevent this from
happening.
I would think it is an effective way to force people to think struct
size bloat of important and populous structure to always measure and
warn. There may be better ways to achieve the same that others may
think of, but I very much appreciate your bringing it up, even only
as a discussion starter.
> struct commit {
> struct object object;
> + unsigned int index;
> timestamp_t date;
> struct commit_list *parents;
>
> @@ -35,7 +36,6 @@ struct commit {
> * or get_commit_tree_oid().
> */
> struct tree *maybe_tree;
> - unsigned int index;
> };
Obviously, ordering members based on size, not their logical
relationships, has its downside. The "object" being at offset 0 is
an integral part of our in-core object design (fake inheritance in
C), but the updated layout gives a false sense that somehow "index"
may have a more important meaning than say "date" or "parents".
We may want to have some comments next to "index" (which is a unique
number given to all in-core commits while they are held in memory,
to allow the commit slab subsystem to use it as an index into flat
array of things) and "date" (which is the committer date taken from
the underlying commit object, without any adjustment), which are two
of these members whose meanings are not immediately obvious.
prev parent reply other threads:[~2026-11-12 19:22 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-12 16:14 [PATCH] commit: remove padding from struct commit Kristofer Karlsson via GitGitGadget
2026-11-12 18:00 ` Derrick Stolee
2026-11-12 19:22 ` Junio C Hamano [this message]
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=xmqqpkw9j1ng.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=krka@spotify.com \
--cc=stolee@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