C++ 使用GoogleMock改进构建时间

C++ 使用GoogleMock改进构建时间,c++,googletest,googlemock,C++,Googletest,Googlemock,我正在寻找用googletest来提高构建时间的策略,我想知道我看到的是典型的,是否有一个特殊的功能可以避免来提高构建时间,或者我只是做错了什么 我见过这个,但它现在大约有2年了 我一直在使用一个中等简单的测试夹具进行评测,该夹具有24个测试,并使用了以下googlemock特性。我很抱歉不能在这里提供一个完整的示例,但显然对于一些微不足道的示例,构建时间可以忽略不计。如果你有这方面的经验和预感,我当然可以根据要求填写更多细节。总的来说,这个构建大约有37个文件,包括googletest的源代码

我正在寻找用googletest来提高构建时间的策略,我想知道我看到的是典型的,是否有一个特殊的功能可以避免来提高构建时间,或者我只是做错了什么

我见过这个,但它现在大约有2年了

我一直在使用一个中等简单的测试夹具进行评测,该夹具有24个测试,并使用了以下googlemock特性。我很抱歉不能在这里提供一个完整的示例,但显然对于一些微不足道的示例,构建时间可以忽略不计。如果你有这方面的经验和预感,我当然可以根据要求填写更多细节。总的来说,这个构建大约有37个文件,包括googletest的源代码

using ::testing::_;
using ::testing::AnyNumber;
using ::testing::DoAll;
using ::testing::Exactly;
using ::testing::InSequence;
using ::testing::Mock;
using ::testing::NiceMock;
using ::testing::Return;
using ::testing::SetArgReferee;
我已经使用cmake和ninja用Clang3.7.0和mingw64-g++5.3.0构建了我的示例。请看下面的《泰晤士报》。项目中的所有源都需要一个完整的构建时间,包括googletest。编译+链接是构建单个测试夹具源和链接所需的时间。链接是创建测试可执行文件的时间。我尝试了tuple标志,但是正如你所看到的,这没有多大区别

随着时间的推移,它们对保持修复/构建/测试周期的快速性提出了一些挑战。我很感兴趣的是,配置带来了如此巨大的差异,而且发布速度比调试快。我希望发布版在优化上花费更多的时间

GTEST_USE_OWN_TR1_TUPLE=1
Compiler | Config  | Full     | Compile+Link | Link
clang    | Debug   | 29.975s  | 16.166s      | 10.046s
clang    | Release | 29.621s  | 13.317s      | 0.972s
mingw64  | Debug   | 1m6.751s | 39.590s      | 22.923s
mingw64  | Release | 44.287s  | 15.075s      | 1.031s

GTEST_USE_OWN_TR1_TUPLE=0
Compiler | Config  | Full     | Compile+Link | Link
clang    | Debug   | 28.565s  | 15.815s      | 9.545s
clang    | Release | 28.354s  | 12.955s      | 1.075s
mingw64  | Debug   | 1m7.954s | 37.611s      | 24.304s
mingw64  | Release | 42.615s  | 15.329s      | 0.895s
发布版本的构建时间的进一步剖析

#include <gmock/gmock.h>     ~ 2s
Instantiating 11 mocks       ~ 9s
24 test cases                ~ 1s

为了真正节省构建时间,您可以使用gtest/gmock 1.6来避免1.7的所有模板编译。虽然不确定这些特定的特性,但可能有些是在1.7中引入的。我实际上尝试了1.6,但没有发现太多的改进。但是我应该重新运行测试并将数字添加到表中,以确保我记得正确,因为我已经尝试了很多不同的配置。由于gtest和gmock源代码是固定的,您是否考虑过使用编译缓存,比如?@AntonioPérez我对ccache不太了解,但我认为这对增量构建问题没有帮助,不对不起,我没有提前提到这是我对这篇文章最感兴趣的地方。在开发测试时,我必须重建测试文件并重新链接可执行文件。但对于构建服务器或其他一些场景,我认为它可能非常有用。
googlemock 1.7+ ddb8012
GTEST_USE_OWN_TR1_TUPLE=0
Compiler | Config  | Full     | Compile+Link | Link
clang    | Debug   | 31.151s  | 7.572s      | 4.567s
clang    | Release | 39.806s  | 4.742s      | 0.689s

googlemock 1.6
GTEST_USE_OWN_TR1_TUPLE=0
Compiler | Config  | Full     | Compile+Link | Link
clang    | Debug   | 26.551s  | 5.104s      | 3.218s
clang    | Release | 28.932s  | 3.777s      | 0.676s