Performance regression when reading files from the tree in parallel
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 42/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Stale
- Tech stack
- csharp, git
- Domain
- performance
Research direction
Start in CommitFixture.cs by adding and running the sequential and Parallel.ForEach reproductions against the versions named in the report. Compare tree and blob-reading behavior around commit 21d4f13ac7c739a5526cf088fbd8765d4ad12f57 on .NET 6 and .NET 7. Done means parallel reads retain the correct count and are faster than sequential reads on a comparable run.
Written by the indexing model from the issue text.
Description
Reproduction steps
- Add the following test cases in
CommitFixture.cs:
[Fact]
public void CanReadCommit()
{
var timer = new Stopwatch();
var fileContents = new ConcurrentStack<string>();
var path = SandboxStandardTestRepo();
using (var repo = new Repository(path))
{
var latestCommit = repo.Head.Tip;
var tree = latestCommit.Tree;
timer.Start();
for (var i = 0; i < 100000; i++)
{
fileContents.Push(ReadEntry("1.txt", tree));
fileContents.Push(ReadEntry("README", tree));
fileContents.Push(ReadEntry("new.txt", tree));
}
timer.Stop();
testOutputHelper.WriteLine($"Took: {timer.ElapsedMilliseconds.ToString()}ms");
Assert.Equal(300000, fileContents.Count);
}
}
[Fact]
public void CanReadCommitParallel()
{
var timer = new Stopwatch();
var fileContents = new ConcurrentStack<string>();
var path = SandboxStandardTestRepo();
using (var repo = new Repository(path))
{
var latestCommit = repo.Head.Tip;
var tree = latestCommit.Tree;
timer.Start();
var fileNames = new List<string>() {"1.txt", "README", "new.txt"}.AsEnumerable();
Parallel.ForEach(fileNames, (fileName) =>
{
for (var i = 0; i < 100000; i++)
{
fileContents.Push(ReadEntry(fileName, tree));
}
});
timer.Stop();
testOutputHelper.WriteLine($"Took: {timer.ElapsedMilliseconds.ToString()}ms");
Assert.Equal(300000, fileContents.Count);
}
}
private static string ReadEntry(string name, Tree tree)
{
var treeEntry = tree[name];
if (treeEntry != null && treeEntry.Target is Blob blob)
{
return blob.GetContentText();
}
throw new InvalidOperationException($"{name} must be a Blob");
}
- Run against version 0.27.0-preview-0119 (commit: 6329bea). On my machine,
CanReadCommitParalleltakes 1417ms andCanReadCommittakes 2971ms (which is fine) - Checkout the latest version or the latest release
- Run the test again. On my machine,
CanReadCommitParalleltakes 3731ms andCanReadCommittakes 3250ms!
Expected behavior
Reading files in parallel should be faster than reading files sequentially from the git tree.
Actual behavior
It seems that reading files from the tree in parallel (multi-thread) is not faster. I did a git bisect and it seems that this regression was introduced in https://github.com/libgit2/libgit2sharp/commit/21d4f13ac7c739a5526cf088fbd8765d4ad12f57
Version of LibGit2Sharp (release number or SHA1)
Versions after https://github.com/libgit2/libgit2sharp/commit/21d4f13ac7c739a5526cf088fbd8765d4ad12f57
Operating system(s) tested; .NET runtime tested
.NET 6 and .NET 7.
- Dominant language
- C#
- Stars
- 3.5k
- Forks
- 925
- PR merge metrics
- No merged PRs in 30d
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from libgit2/libgit2sharp
-
Difficulty 4/5 3-5 days Newbie friendliness 52/100
libgit2/libgit2sharp#2193 · 2 comments ·
-
Difficulty 4/5 3-5 days Newbie friendliness 38/100
libgit2/libgit2sharp#2192 · 1 comment ·
-
Website is down Open
Difficulty 4/5 3-5 days Newbie friendliness 20/100
libgit2/libgit2sharp#2191 · 2 reactions ·
-
Difficulty 3/5 1-2 days Newbie friendliness 68/100
libgit2/libgit2sharp#2189 · 1 reaction ·
-
Difficulty 3/5 1-2 days Newbie friendliness 35/100
libgit2/libgit2sharp#2187 · 2 comments ·
All issues in libgit2/libgit2sharp
Similar issues
-
:watch: Not Triaged dotnet-fsharp/svc
Difficulty 1/5 Under an hour Newbie friendliness 90/100
-
Client customer-reported needs-team-attention question Service Attention WebPubSub
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Azure/azure-sdk-for-net#63292 · 3 comments · 1 reaction ·
-
Issue-Enhancement Needs-Triage
Difficulty 1/5 Under an hour Newbie friendliness 86/100
PowerShell/PowerShell#28061 · 2 reactions ·
-
dependencies needs-team-triage server-Azure.Mcp
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
-
aspnet-core/svc aspnetcore-signalr/subsvc doc-enhancement Pri2 SignalR
Difficulty 1/5 Under an hour Newbie friendliness 88/100
dotnet/AspNetCore.Docs#37729 ·