gpt4 book ai didi

libclang - 使用 libclang 解析多个文件时可以共享工作吗?

转载 作者:太空宇宙 更新时间:2023-11-04 13:50:21 25 4
gpt4 key购买 nike

如果我在一个大项目中有多个文件,所有这些文件共享大量包含的头文件,有没有办法分担解析头文件的工作?我曾希望创建一个 Index 然后向其添加多个 translationUnits 可能会导致一些工作被共享——但即使是类似(伪代码)的代码

index = clang_createIndex();
clang_parseTranslationUnit(index, "myfile");
clang_parseTranslationUnit(index, "myfile");

似乎每次调用 parseTranslationUnit 都占用了全部时间,性能并不比

index1 = clang_createIndex();
clang_parseTranslationUnit(index1, "myfile");
index2 = clang_createIndex();
clang_parseTranslationUnit(index2, "myfile");

我知道有专门的函数可以重新解析完全相同的文件;然而,我真正想要的是解析“myfile1”和“myfile2”可以分担解析“myheader.h”的工作,而重新解析特定函数对此无济于事。

作为一个子问题,重用索引和为每个翻译单元创建新索引之间有什么有意义的区别吗?

最佳答案

执行此操作的一种方法是从项目中的共享 header 创建预编译 header (PCH 文件)。

按照这些思路似乎可行(您可以看到整个示例 here ):

  auto Idx = clang_createIndex (0, 0);
CXTranslationUnit TU;
Timer t;

{
char const *args[] = { "-xc++", "foo.hxx" };
int nargs = 2;

t.reset();
TU = clang_parseTranslationUnit(Idx, 0, args, nargs, 0, 0, CXTranslationUnit_ForSerialization);
std::cerr << "PCH parse time: " << t.get() << std::endl;
displayDiagnostics (TU);
clang_saveTranslationUnit (TU, "foo.pch", clang_defaultSaveOptions(TU));
clang_disposeTranslationUnit (TU);
}

{
char const *args[] = { "-include-pch", "foo.pch", "foo.cxx" };
int nargs = 3;

t.reset();
TU = clang_createTranslationUnitFromSourceFile(Idx, 0, nargs, args, 0, 0);
std::cerr << "foo.cxx parse time: " << t.get() << std::endl;
displayDiagnostics (TU);
clang_disposeTranslationUnit (TU);
}

{
char const *args[] = { "-include-pch", "foo.pch", "foo2.cxx" };
int nargs = 3;

t.reset();
TU = clang_createTranslationUnitFromSourceFile(Idx, 0, nargs, args, 0, 0);
std::cerr << "foo2.cxx parse time: " << t.get() << std::endl;
displayDiagnostics (TU);
clang_disposeTranslationUnit (TU);
}

产生以下输出:

PCH parse time: 5.35074
0 diagnostics

foo1.cxx parse time: 0.158232
0 diagnostics

foo2.cxx parse time: 0.143654
0 diagnostics

我在API文档中没有找到太多关于libclang和预编译头的信息,但这里有几页出现关键字:CINDEXTRANSLATION_UNIT

请注意,这个解决方案无论如何都不是最优的。我期待看到更好的答案。特别是:

  1. 每个源文件最多可以有一个预编译头
  2. 这里没有任何东西是 libclang 特定的;这与使用标准 clang 命令行优化构建时间的策略完全相同。
  3. 它并不是真正的自动化,因为您必须显式创建预编译头文件(因此必须知道共享头文件的名称)
  4. 我认为在这里使用不同的 CXIndex 对象不会有任何不同

关于libclang - 使用 libclang 解析多个文件时可以共享工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23681172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com