Clang PCH 性能比标头差?

2024-07-01

我在源文件中包含一组标头,这些标头很少/从未更改。解析/重新解析使用标头的频繁更改的源文件(IDE 用例)需要太长时间(几秒钟)。作为提高性能的一种方式,我想使用 Clang PCH。请注意,我正在 Android 上以发布模式(99% 确定)编译 libclang(不是最新版本)。

我已经按照回答类似的问题 https://stackoverflow.com/a/20952634/1103561但与标头解析相比,PCH 的性能差 3 倍(使用具有 100000 个的人工标头)#define宏):

2020-08-11 12:03:53.265 19767-19788 W/TranslationUnitTest: PCH parse time: 0.462277
2020-08-11 12:03:53.265 19767-19788 W/TranslationUnitTest: 0 diagnostics
2020-08-11 12:03:55.768 19767-19788 W/TranslationUnitTest: Source parse time: 1.456947
2020-08-11 12:03:55.768 19767-19788 W/TranslationUnitTest: 0 diagnostics

Java源代码(在Android Instrumentation测试中运行):

final Context context = InstrumentationRegistry.getInstrumentation().getTargetContext();

// create PCH
dir = new File(context.getCacheDir(), String.valueOf(Math.abs(new Random().nextLong())));
dir.mkdirs();

deeperHeaderFile = new File(dir, "deeperHeader.h");
StringBuilder sb = new StringBuilder("#define VAL 1 ");
for (int i=0; i<100000; i++) {
    sb.append("\n");
    sb.append("#define VAL" + i + " " + i);
}
setFileContent(deeperHeaderFile, sb.toString());

headerFile = new File(dir, "header.hxx");
setFileContent(headerFile, "#include \"deeperHeader.h\"");

pchFile = new File(dir, "header.pch");

sourceFile = new File(dir, "source.cpp");
setFileContent(sourceFile, "#include \"header.hxx\"\nint main() { return VAL; }");

// C++ test
Clang.testPch(
    pchFile.getAbsolutePath(),
    headerFile.getAbsolutePath(),
    deeperHeaderFile.getAbsolutePath(),
    sourceFile.getAbsolutePath());

C++源代码:

class Timer {
public:
    Timer () {
      reset();
    }

    double get () {
      struct timeval now;
      gettimeofday (&now, NULL);

      return now.tv_sec - start_.tv_sec + 1e-6 * (now.tv_usec - start_.tv_usec);
    }

    void reset () {
      gettimeofday (&start_, NULL);
    }

private:
    struct timeval start_;
};

void displayDiagnostics(CXTranslationUnit TU) {
  if (TU == 0) {
    std::cerr << "Parsing error!" << std::endl;
    return;
  }

  int numDiagnostics = clang_getNumDiagnostics (TU);

  __android_log_print(ANDROID_LOG_WARN, TAG, "%d diagnostics", numDiagnostics);

  for (int i=0 ; i<numDiagnostics ; ++i) {
    auto diagnostic = clang_getDiagnostic(TU, i);
    auto string = clang_formatDiagnostic(diagnostic, clang_defaultDiagnosticDisplayOptions());
    auto cString = clang_getCString(string);

    __android_log_print(ANDROID_LOG_WARN, TAG, "diag #%d: %s", i, cString);

    clang_disposeString(string);
    clang_disposeDiagnostic(diagnostic);
  }
}

JNIEXPORT void JNICALL Clang_testPch(
    JNIEnv *env, jclass clazz,
    jstring jPchFilename, jstring jHeaderFilename, jstring jDeeperHeaderFilename, jstring jSourceFilename) {

  char *cPchFilename = string_copy(env, jPchFilename);
  char *cHeaderFilename = string_copy(env, jHeaderFilename);
  char *cDeeperHeaderFilename = string_copy(env, jDeeperHeaderFilename);
  char *cSourceFilename = string_copy(env, jSourceFilename);

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

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

    t.reset();
    TU = clang_parseTranslationUnit(Idx, 0, args, nargs, 0, 0, CXTranslationUnit_ForSerialization);
    auto pchParsetime = t.get();
    __android_log_print(ANDROID_LOG_WARN, TAG, "PCH parse time: %f", pchParsetime);
    displayDiagnostics(TU);
    clang_saveTranslationUnit(TU, cPchFilename, clang_defaultSaveOptions(TU));
    clang_disposeTranslationUnit(TU);
  }

  {
    char const *args[] = { "-include-pch", cPchFilename, cSourceFilename };
    int nargs = 3;

    t.reset();
    TU = clang_createTranslationUnitFromSourceFile(Idx, 0, nargs, args, 0, 0);
    auto parseTime = t.get();
    __android_log_print(ANDROID_LOG_WARN, TAG, "Source parse time: %f", parseTime);
    displayDiagnostics(TU);
    clang_disposeTranslationUnit(TU);
  }

  // release
  delete []cPchFilename;
  delete []cHeaderFilename;
  delete []cDeeperHeaderFilename;
  delete []cSourceFilename;
}

我相信文件是用 Java 编写的并没有什么区别(最初的原因是我有 clang 绑定并且 Java 代码具有相同的[坏]性能,所以我更改了要在 C++ 中测试的代码)。

我错过了什么吗?有什么愚蠢的错误吗?有什么建议么?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Clang PCH 性能比标头差? 的相关文章

随机推荐

  • 从脚本中获取最后执行的命令

    我试图从脚本中获取最后执行的命令行命令 以供以后参考 例子 echo Hello World gt Hello World my script sh gt echo Hello World 脚本的内容是 usr bin ksh fc nl
  • 仅当在存储过程中运行时,出现“ORA-00942:表或视图不存在”

    对于 PL SQL 人员来说这应该很容易选择 在将此问题标记为重复之前 请确保虽然错误消息可能很常见 但根本问题与上一个问题相同 如果是这样 请提供已解决的确切逻辑重复问题的链接 我 当我登录到我的架构时 我执行以下 PL SQL 代码 D
  • 如何使代码契约忽略特定的程序集引用?

    我正在对 Visual Studio 进行扩展 在代码中 我使用代码契约来进行断言和检查 我将警告选项级别设置为高 我想要做的是保持该警告级别 同时忽略对 EnvDTE 引用进行的任何检查 考虑以下代码示例 public static st
  • SQL Server 2012 - 使用 openquery 插入链接服务器表

    我有一个链接服务器Remoteserver包含一个表 其中保存目录中的文件和文件夹名称 当我在远程服务器上时 我可以运行内置程序 xp dirtree 并填充 文件 表 但我需要做的是从本地 SQL 服务器运行一个查询来执行以下操作 删除所
  • 在没有 S3 的情况下设置 Amazon Cloudfront

    我想使用 Cloudfront 从我的静态网站提供图像和 CSS 我读过无数文章展示如何使用 Amazon S3 设置它 但我只想将文件托管在我的主机上并使用云前端来加速所述文件的传输 我只是不确定如何去做 到目前为止 我已经使用我的原始域
  • 路径必须是字符串。将我的科尔多瓦升级到 7.1.0 后收到未定义的消息

    E ionic template gb IonicMaterialDesign gt cordova 平台添加 android 使用 cordova fetch for cordova android 6 3 0 添加 android 项目
  • 在自定义 CellRenderer 中重写 createToolTip()

    我正在尝试为 JTable 的特定列获取自定义工具提示 我已经创建了一个 CellRenderer 我已经成功更改了其他特定于单元格的属性 private class CustomCellRenderer extends DefaultTa
  • C# 中 Action 委托的使用 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在与 C 中的 Action Delegates 合作 希望更多地了解它们并思考它们可能在哪些方面有用 有人使用过 Action
  • 如何使用 pkg-config 在 Xcode 中设置包含路径?

    例如 如果我需要 Gtk 包含路径 如何使用pkg config gtk 2 0 cflags在 Xcode 项目设置中 一种选择 但它对于项目中的其他开发人员来说不太方便 您可以运行pkg config gtk 2 0 cflags在您的
  • JCombo AutoComplete - 模式或反向查找

    我正在使用swingx 库中的自动完成装饰器 http download java net javadesktop swinglabs releases 0 8 docs api org jdesktop swingx autocomple
  • 如何删除 JComboBox 的“单击并查看下拉菜单”功能?

    我有一个 JComboBox 它使用 GlazedLists 添加预输入功能 我希望用户输入一个字符串并看到预先输入的内容 这要归功于 Glazedlists 但是 我不希望用户能够单击组合框的向下箭头并检查下拉列表 我已使向下箭头不可见并
  • 了解 HTML 5 事件拖动

    我不明白为什么在事件拖动中鼠标坐标clientX的返回值总是0或释放鼠标之前的负值 我准备了一个例子 当用户dragstart 鼠标位置正确 结束同样dragend 但是如果你查看控制台drag你会看到之前dragend负值 是正常行为吗
  • html5 画布上下文 .fillStyle 不起作用

    只是为了创建一个游戏而第一次尝试canvas 我显示了一个图像 但奇怪的是 fillStyle 方法似乎不起作用 至少画布背景在谷歌浏览器中仍然是白色的 请注意 在我的代码中 画布变量实际上是画布元素的二维上下文 也许这就是我让自己感到困惑
  • MySQL:选择具有适用于多行的条件的记录

    我有一张桌子 DETAILS ID PARENT ID DATA KEY DATA VALUE 1 1 Guitar 4 2 1 Radio 2
  • 设置 JavaFX TreeView 线条样式

    在 Java Swing 中 有 JTree linestyle 属性 用于启用 禁用将树中的父节点连接到其子节点的线 JavaFX 2 中有类似的东西吗 在我看过的所有 JavaFX TreeView 示例中 我都没有看到这一点 我也没有
  • Perl 中的异常有什么问题?

    中的讨论另一个问题 https stackoverflow com questions 2164614 what should i do if a moose builder method fails让我想知道 其他编程语言的异常系统有哪些
  • 如何在组织模式导出中按编号引用部分?

    我正在组织模式下工作 并尝试生成一个链接来通过编号而不是标题来引用部分 Section One PROPERTIES CUSTOM ID sec one END Section Two label sec two I can referen
  • 适用于 Chrome 和 Internet Explorer 的 GWT Developer 插件 - 阻止安装的错误

    我尝试安装适用于 Chrome 的 GWT Developer 插件 版本 34 0 1847 131 m 但收到以下错误 此计算机不支持此应用程序 安装已被禁用 检测到以下问题 和 NPAPI 插件此应用程序需要 有没有解决的办法 我已经
  • 在 Xcode 4 中显示方法定义/描述

    有没有办法在 Xcode iOS 项目中向我的方法添加描述 以便我可以在使用 OPTION 单击所需的方法时看到快速详细信息 就像在 Apple 的 API 方法上完成的那样 如下例 Thanks 如果我理解正确的话 那么所有这些工具都是用
  • Clang PCH 性能比标头差?

    我在源文件中包含一组标头 这些标头很少 从未更改 解析 重新解析使用标头的频繁更改的源文件 IDE 用例 需要太长时间 几秒钟 作为提高性能的一种方式 我想使用 Clang PCH 请注意 我正在 Android 上以发布模式 99 确定