我为我正在开发的项目创建了一个单元测试套件。我的单元测试过去非常快......其中200多个会在几秒钟内运行。通常,每次测试将花费不到10毫秒。现在使用Valgrind和Gcov时,每次测试都需要1.5分钟才能运行!有没有人有过非常慢的单元测试的经验? Valgrind,gcov或Google Test会在任何特定情况下导致程序执行速度显着下降吗?更令人困惑的是,一些单元测试运行得很好(即非常快),而其他单元测试需要花费很多秒才能运行。通常,当再次运行单元测试时,相同的测试需要不同的时间来运行。我基本上试图弄清楚瓶颈在哪里。以下是一个例子:
[ RUN ] BandwidthAlgorithmTest.TerminalsOnly
[ OK ] BandwidthAlgorithmTest.TerminalsOnly (34 ms)
[ RUN ] BandwidthAlgorithmTest.AlohaAndTerminals
[ OK ] BandwidthAlgorithmTest.AlohaAndTerminals (38 ms)
[ RUN ] BandwidthAlgorithmTest.AllocatePeriodic
[ OK ] BandwidthAlgorithmTest.AllocatePeriodic (304 ms)
[ RUN ] BandwidthAlgorithmTest.AllocatePeriodic_Disabled
[ OK ] BandwidthAlgorithmTest.AllocatePeriodic_Disabled (152 ms)
[ RUN ] BandwidthAlgorithmTest.AllocateFair
[ OK ] BandwidthAlgorithmTest.AllocateFair (109 ms)
[ RUN ] BandwidthAlgorithmTest.AllocateFair_Disabled
[ OK ] BandwidthAlgorithmTest.AllocateFair_Disabled (64 ms)
[----------] 12 tests from BandwidthAlgorithmTest (2763 ms total)
[----------] 7 tests from BacklogHelperTest
[ RUN ] BacklogHelperTest.ChangeInrouteState
[ OK ] BacklogHelperTest.ChangeInrouteState (80613 ms)
[ RUN ] BacklogHelperTest.GetInvalidInroute
[ OK ] BacklogHelperTest.GetInvalidInroute (98471 ms)
答案 0 :(得分:3)
如果你对valgrind的表现感到失望,你可以试试Google的初出茅庐的AddressSanitizer。 http://blog.chromium.org/2011/06/testing-chromium-addresssanitizer-fast.html它需要使用特殊的编译器重新编译代码,但不需要进行源代码级更改。
答案 1 :(得分:0)
这里提到了一个潜在的原因:https://groups.google.com/forum/#!topic/gnu.gcc.help/aS3mQGzGE_4 - 似乎gcov在某处有一个O(n ^ 2)步骤,并且对长(CPP后)源线敏感,或者沿着这些线路。