Why is Git so Fast?
In the DVCS world, Git has a
reputation for being really fast. I
am curious about how Git got this way.
When I started thinking about this
question, seven different answers came
to my mind. Some of those answers
seem more interesting or correct than
others.
One: Maybe Git is fast simply because
it's a DVCS.
There's probably some truth here. One
of the main benefits touted by the
DVCS fanatics is the extra performance
you get when everything is "local".
But this answer isn't enough. Maybe
it explains why Git is faster than
Subversion, but it doesn't explain why
Git is so often described as being
faster than the other DVCSs.
Two: Maybe Git is fast because Linus
Torvalds is so smart.
This might very well be correct. But
it's not interesting.
Fine. So Linus is smarter than all of
us. But how did he use those smarts
to make Git so fast? What are the
details?
Three: Maybe Git is fast because it's
written in C instead of one of those
newfangled higher-level languages.
Nah, probably not. Lots of people
have written fast software in C#, Java
or Python.
And lots of people have written really
slow software in traditional native
languages like C/C++. Adobe writes
most of their stuff in C++, and they
don't have any trouble making sure
that release N+1 is slower than
release N.
Four: Maybe Git is fast because being
fast is the primary goal for Git.
This is another one of those
high-level answers that is probably
correct but doesn't have the kind of
details about which I am curious.
Still. Take some time to read through
the archives of the Git developers
mailing list. These people spend a
LOT of time talking about performance
issues.
Five: Maybe Git is fast because it
does less.
One of my favorite recent blog entries
is this piece which claims that the
way to make code faster is to have it
do less.
Predictably, people came out of the
woodwork to say how wrong this guy
was. That's what happens to almost
any blog entry about performance
tuning or optimization. Readers
ignore anything correct in the article
and quibble about little stuff.
But this guy was essentially correct.
One way to make software faster is to
make it do less.
For example, the way you get something
in the Git index is you use the "git
add" command. Git doesn't scan your
working copy for changed files unless
you explicitly tell it to. This can
be a pretty big performance win for
huge trees. Even when you use the
"remember the timestamp" trick,
detecting modified files in a really
big tree can take a noticeable amount
of time.
Or maybe Git's shortcut for handling
renames is faster than doing them more
correctly like Bazaar does.
Six: Maybe Git is fast because it
doesn't use much external code.
Very often, when you are facing a
decision to use somebody else's code
or write it yourself, there is a
performance tradeoff. Not always, but
often. Maybe the third party code is
just slower than the code you could
write yourself if you had time to do
it. Or maybe there is an impedance
mismatch between the API of the
external library and your own
architecture.
This can happen even when the library
is very high quality. For example,
consider libcurl. This is a great
library. Tons of people use it. But
it does have one problem that will
cause performance problems for some
users: When using libcurl to fetch an
object, it wants to own the buffer.
In some situations, this can end up
forcing you to use extra memcpys or
temporary files. The reason all the
low level calls like send() and recv()
allow the caller to own the loop and
the buffer is because this is the best
way to avoid the need to make extra
copies of the data on disk or in
memory.
People make fun of those with NIH
Syndrome, but my observation is that
folks who suffer from this disorder
tend to create faster software, even
if they also tend to ship everything
late. :-)
Maybe Git is fast because every time
they faced one of these "buy vs.
build" choices, they decided to just
write it themselves.
Seven: Maybe Git isn't really that
fast.
If there is one thing I've learned
about version control it's that
everybody's situation is different.
It is quite likely that Git is a lot
faster for some scenarios than it is
for others.
How does Git handle really large
trees? Git was designed primary to
support the efforts of the Linux
kernel developers. A lot of people
think the Linux kernel is a large
tree, but it's really not. Many
enterprise configuration management
repositories are FAR bigger than the
Linux kernel.
Final thoughts
This week's version control blog entry
raises more questions than answers.
I'm not a Git user, nor have I looked
much at its code, so I don't really
know why it's so fast. I'm just
curious. If you have better answers
than mine (and I admit that's a low
hurdle), feel free to send them to me
or post them in my comments.
But FWIW, I have decided it is time
for me to become a Git user. When I
was writing about Git a few weeks ago,
a lot of Git users kept telling me I
just don't get it. I've spent more
time thinking about version control
implementation and design than most
folks, so I tend to think I actually
do "get it". But my curiosity is
piqued, and I hate to pass up an
opportunity to learn something, so I'm
going to give it a try. I've got a
small project here at SourceGear that
I work on part-time with a couple
other people. We've decided to switch
to Git and see how it goes. I'll let
you know what I find out.