【问题标题】:Performance issue while iterating through repo's commits?迭代回购提交时的性能问题?
【发布时间】:2014-03-20 16:28:56
【问题描述】:

我只想显示存储库的前 100 次提交。我使用 linux-repo 进行了测试:

        const int maxSize = 100;

        Stopwatch sw = new Stopwatch();
        Console.WriteLine( "Getting Commits in own Thread" );
        sw.Start();

        using( Repository repo = new Repository( path_to_linux_repo ) )
        {
            ICommitLog commits = repo.Commits.QueryBy( new CommitFilter { Since = "HEAD" } );

            int index = 0;
            foreach( Commit commit in commits )
            {
                if( index++ > maxSize ) break;                    
            }
        }

        sw.Stop();
        Console.WriteLine( "Took {0}ms for {1} entries", sw.ElapsedMilliseconds, maxSize ); 

这个简单的循环在我的机器上占用了 9000 多毫秒。使用提交较少的 repo 时它的速度更快,但为什么在提交很多的 repo 中速度如此之慢? 另一个问题:是否可以只检索给定数量的提交,例如翻页 所有提交?

【问题讨论】:

  • 查看 100 次提交肯定不会花那么长时间。如果您将CommitFilterSortBy = CommitSortStrategies.None 一起使用,它仍然很慢吗?
  • 没有区别。也花了9000毫秒。即使根本没有任何 CommitFilter。
  • 不通过过滤器意味着使用时间排序。这与传递无排序不同。

标签: libgit2sharp


【解决方案1】:

我可以在这里重现。这绝对是太长了。看起来 libgit2 在返回之前将整个图排入队列,这将是给定设置的错误。你介意打开一个问题吗?

至于检索多个提交,迭代是基于拉取的,因此您只会从存储库中获取您要求的数量。提交日志实现了IEnumerable,因此您可以使用您喜欢的任何 LINQ 方法(或者像本示例中那样手动执行)。


更新:

这个错误非常令人尴尬,但 libgit2 中有一个 PR to fix it,它将在适当的时候进入 libgit2sharp 版本。修复后,此测试现在需要约 80 毫秒。感谢您提出。

更新 2:

该修复程序现已在 LibGit2Sharp 的 vNext 分支中提供。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2016-12-26
    • 2013-07-22
    相关资源
    最近更新 更多