1

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

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

4

2 回答 2

1

似乎 Visual Studio 框架的设计使得收集可执行文件和优化的可执行文件是相同的。

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

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

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

于 2014-07-27T15:53:36.963 回答
0

似乎 Visual Studio 框架的设计使得收集可执行文件和优化的可执行文件是相同的。

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

于 2015-10-19T10:14:25.403 回答