Модульные тесты занимают много времени. Проблема Вальгринда? Гков проблема? - PullRequest
2 голосов
/ 17 июня 2011

Я создал набор тестов для проекта, над которым я работаю. Мои юнит-тесты выполнялись очень быстро ... 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 ]

3 голосов
/ 19 июня 2011

Если вы разочарованы производительностью valgrind, вы можете попробовать только что созданный AddressSanitizer от Google.http://blog.chromium.org/2011/06/testing-chromium-addresssanitizer-fast.html Требуется перекомпиляция вашего кода с помощью специального компилятора, но никаких изменений на уровне исходного кода не требуется.

0 голосов
/ 28 января 2014

Здесь упоминается одна потенциальная причина: https://groups.google.com/forum/#!topic/gnu.gcc.help/aS3mQGzGE_4 - кажется, что gcov где-то имеет шаг O (n ^ 2) и чувствителен к длинным (пост-CPP) исходным линиям или что-то вроде этих линий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...