发布
社区首页 >问答首页 >libgit:在提交中获取文件的最快方法

libgit:在提交中获取文件的最快方法
EN

Stack Overflow用户
提问于 2015-12-08 13:23:15
回答 1查看 419关注 0票数 2

我需要迭代存储库的提交,并为每个提交获取受影响的文件。这是目前我的巨大的性能瓶颈。

我在libgit函数上有一个C++包装器,但是这个片段应该是可以理解的。

代码语言:javascript
代码运行次数:0
复制
std::vector<std::string> Commit::getAffectedFiles() const {
  git_tree* tree = nullptr;
  git_tree* tree2 = nullptr;
  int error = git_commit_tree(&tree, get());
  throw_on_error(error);

  try {
    error = git_commit_tree(&tree2, parent(0).get());
  } catch (GitException e) {
    tree2 = nullptr; // probably initial commit
  }
  git_diff* diff = nullptr;
  git_diff_tree_to_tree(&diff, getRepo(), tree2, tree, 0);  

  std::vector<std::string> ret;
  git_diff_foreach(diff,
  [](const git_diff_delta* entry, float progress, void* payload) {
    std::string str = entry->old_file.path;
    ((std::vector<std::string>*)payload)->push_back(str);
    return 0;
  }, nullptr, nullptr, nullptr, &ret);
  git_tree_free(tree);
  git_tree_free(tree2);
  git_diff_free(diff);
  return ret; 
}

我只能希望我在这里做了一些根本错误的事情。

例如

代码语言:javascript
代码运行次数:0
复制
git log --stat > /dev/null

速度要快得多,并提供相同的信息。

perf按顺序报告git__strncmpgit_buf_rfind_nextgit_tree__parse上的大多数使用情况。

我知道这是IO很重,但我不认为有一个简单的方法来减少这个或并行运行这一点。

EN

回答 1

Stack Overflow用户

发布于 2015-12-11 17:11:26

这相当于git在内部所做的事情,尽管git本身已经有更多的人关注它的性能,而libgit2在这方面的投资也没有那么多。

然而,最近有几个补丁被合并到libgit2 2的master分支中,可以节省多达40%的树解析时间。我建议您试一试,看看得到了哪些数字(补丁也应该很容易移植到早期版本)。

还要考虑到,您的git版本很可能是在发布模式下编译的,而libgit2默认是在调试模式下编译的,所以如果您还没有激活发布模式,请使用-DCMAKE_BUILD_TYPE=Release运行cmake。这也大大加快了这些解析操作。

具体而言,PR 3508和提交0174f2fc4364

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34157047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档