使用 libgit2 同时多次读取存储库的最佳方法,performance/memory 明智吗?

Best way to read a repository multiple times at the same time using libgit2, performance/memory wise?

我正在使用libgit2,我想同时读取两个不同的分支并将它们放在两个不同的列表中。

我担心那种情况下的 performance/memory 消耗。

引用 libgit2 网站上的 git_revwalk_new API 页面:

This revision walker uses a custom memory pool and an internal commit cache, so it is relatively expensive to allocate.

For maximum performance, this revision walker should be reused for different walks.

This revision walker is not thread safe: it may only be used to walk a repository on a single thread; however, it is possible to have several revision walkers in several different threads walking the same repository.

我最初的方法是对两个列表使用两个 walker,每个都在不同的线程上。他们会同时遍历存储库,每个遍历器都会包含列表中目标分支的提交。

但是,根据我对网站引述的理解,如果我错了请纠正我,分配新的 RevisionWalker 是昂贵的,因此在大型存储库的情况下可能会消耗大量内存.此外,walker 使用它的内部缓存,因此如果我们多次使用同一个 walker,重新读取和查找提交会更快。

所以我的第二个想法是只在同一个线程上同步使用一个 walker。我在其中包含第一个分支的提交,开始阅读提交,并将它们放在第一个列表中。然后我再次重置 walker,包括第二个分支的提交,重新读取存储库提交并将它们放在第二个列表中。

我尝试了两种方法,在内存方面,没有太大区别,两者使用的内存大致相同。在性能方面,也没有太大区别。

那么在这种情况下你有什么建议呢?或者有什么更好的解决办法吗?

一个 git_revwalk 不应该 建造起来很昂贵,实际上。听起来您已经评估了这两个选项并确定确实没有功能差异。因此,我鼓励您使用 code-wise 最简单、最容易维护且易于推理的那个。

通常这是没有线程的那个,但这只是一种猜测。

连续进行两次调用的另一个好处是,您可能会遇到可以根据第一次的结果优化第二次修订遍历的情况。例如,如果你不想在第二个分支中处理提交,如果你已经在第一个分支中看到它们,或者你可以根据它们在第一个分支中的知识优化掉你正在做的任何事情,然后 git_revwalk_hide处理这些提交可能会使整体计算更有效率。