Performance regression when reading files from the tree in parallel
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 42/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Đình trệ
- Công nghệ
- csharp, git
- Lĩnh vực
- performance
Hướng nghiên cứu
Bắt đầu trong CommitFixture.cs bằng cách thêm và chạy các bản tái hiện tuần tự và Parallel.ForEach với các phiên bản được nêu trong báo cáo. So sánh hành vi đọc tree và blob xung quanh commit 21d4f13ac7c739a5526cf088fbd8765d4ad12f57 trên .NET 6 và .NET 7. Được xem là hoàn tất khi các thao tác đọc song song vẫn giữ đúng số lượng và nhanh hơn các thao tác đọc tuần tự trong một lần chạy có thể so sánh.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
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.
- Ngôn ngữ chính
- C#
- Star
- 3.5k
- Fork
- 925
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của libgit2/libgit2sharp
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 52/100
libgit2/libgit2sharp#2193 · 2 bình luận ·
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 38/100
libgit2/libgit2sharp#2192 · 1 bình luận ·
-
Website is down Đang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 20/100
libgit2/libgit2sharp#2191 · 2 reaction ·
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 68/100
libgit2/libgit2sharp#2189 · 1 reaction ·
-
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 35/100
libgit2/libgit2sharp#2187 · 2 bình luận ·
Tất cả issue của libgit2/libgit2sharp
Issue tương tự
-
bug
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 75/100
sillsdev/languageforge-lexbox#2665 ·
-
bug documentation frontend
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
azurenoops/spin_agent#975 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 86/100
-
:watch: Not Triaged 11.0 fundamentals/subsvc
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 92/100
dotnet/AspNetCore.Docs#37699 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
SubtitleEdit/subtitleedit#15108 · 1 bình luận ·