单元测试需要很长时间才能运行。 Valgrind的问题? Gcov问题?

时间:2011-06-17 17:59:20

标签: c++ unit-testing valgrind gcov

我为我正在开发的项目创建了一个单元测试套件。我的单元测试过去非常快......其中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)

2 个答案:

答案 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后)源线敏感,或者沿着这些线路。