Visual Studio:使用从一个 exe 到不同 dll 的配置文件引导优化的结果?

Posted

技术标签:

【中文标题】Visual Studio:使用从一个 exe 到不同 dll 的配置文件引导优化的结果?【英文标题】:Visual Studio: use the results of Profile Guided Optimization from one exe to a different dll? 【发布时间】:2014-07-24 14:54:23 【问题描述】:

我有一个 dll,将其命名为 core.dll,我想使用 Visual Studio 出色的 Profile Guided Optimization 对其进行优化。大部分代码实际上是 dll 编译成一个名为 core.lib 的库,然后由 core.dll 包装。 为了对这段代码进行单元测试,我还有一个名为test_core.exe 的测试程序可执行文件。这个可执行文件链接到core.lib 并从中激活各种功能。 DLL core.dll 的导出很少,仅足以启动其主要功能。无法使用这些导出进行完全单元测试。 我想要的是通过激活test_core.exe 中的一些测试来收集PGO 数据,然后使用这个PGO 数据链接和优化core.dll

似乎Visual Studio框架被设计成收集可执行文件和优化的可执行文件是相同的。 一种选择是将相关测试添加到 core.dll 中,并使用特殊的导出运行它们,但这会使 core.dll 膨胀,测试代码不会在任何其他情况下使用。

【问题讨论】:

【参考方案1】:

似乎Visual Studio框架被设计成收集可执行文件和优化的可执行文件是一样的。

这是非常、非常故意的。配置文件引导优化只有在使用从用户运行程序方式的真实模拟中收集的配置文件数据时才能正常工作。这需要部署给用户的实际可执行文件,并使用与程序将在用户站点处理的数据合理匹配的真实数据。

尝试使用测试单元配置文件结果来提高它会达到相反的效果,您的用户不会以相同的方式运行代码。您最终得到一个较少优化的程序的可能性很大。您收集的配置文件数据仅足以优化单元测试,没有用处。

不要尝试烹制个人资料数据,它行不通。这确实意味着如果您需要单元测试来查看信号,您不一定能轻松衡量优化的有效性。在这种情况下,您只需假设 PGO 完成了工作。

【讨论】:

你假设很多。我的测试器包含从真实用户会话馈送到相关组件的输入的记录。如果你对这个问题没有答案,你就不应该回答。投反对票。 如果您没有正确记录您的问题并让人觉得您不知道 PGO 是关于什么的,就会发生这种情况。回来一个。【参考方案2】:

似乎 Visual Studio 框架的设计目的是 收集可执行文件和优化的可执行文件是一样的。

这是真的,但在您的情况下,您想要优化 DLL,而不是可执行文件。您可以使用/GL 开关编译静态库和DLL,并使用/LTCG:PGINSTRUMENT 开关链接DLL。这将创建一个已检测的 DLL。 test_core.exe 图像不必进行检测,因此您可以正常编译它(在调试或发布模式下)。然后,通过运行test_core.exe,将生成一个PGC 文件,其中仅包含core.dll 的行为配置文件。然后可以使用此配置文件来优化core.dll,方法是再次编译它并指定/LTCG:PGOPTIMIZE 开关。只要test_core.exe练习core.dll常见的使用场景,你一定会从中受益。请参阅this 了解更多信息。

【讨论】:

以上是关于Visual Studio:使用从一个 exe 到不同 dll 的配置文件引导优化的结果?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MSBuild 从 Visual Studio 2013 命令行发布 Clickonce 找不到 SignTool.exe

调试期间在 Visual Studio 中自动附加到子进程

将 Visual Studio 扩展 (VSIX/DLL) 整合到一个 exe 中

Visual Studio 编译,但 exe 不存在

如何从 Visual Studio 2010 安装程序运行 schtasks.exe?

从PowerShell设置Visual Studio环境变量