迭代repo提交时的性能问题?

时间:2014-03-20 16:28:57

标签: libgit2sharp

我想只显示存储库的前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 ); 

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

1 个答案:

答案 0 :(得分:3)

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

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


<强>更新

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

更新2:

此修复程序现在可在LibGit2Sharp的vNext分支中找到。