Search code examples
gccgcovlcov

lcov + gcov-9 performance regression because of json usage


I have updated my build environment compiler from gcc 5.5.0 to gcc 9.3.0 and noticed coverage calculation performance regression.

It became 10 times slower (5 hours vs 48 hours for whole project).

My investigation shows that in gcov-9 they started to use json format instead of intermediate text format. This slowed down intermediate gcov-files creation and parsing.

Minimal example below:

> time geninfo --gcov-tool gcov-5 test5/CPrimitiveLayerTest.cpp.gcno 
Found gcov version: 5.5.0
Using intermediate gcov format
Processing test5/CPrimitiveLayerTest.cpp.gcno
Finished .info-file creation

real    0m0.351s
user    0m0.298s
sys     0m0.047s

> time geninfo --gcov-tool gcov-9 test9/CPrimitiveLayerTest.cpp.gcno 
Found gcov version: 9.3.0
Using intermediate gcov format
Processing test9/CPrimitiveLayerTest.cpp.gcno
Finished .info-file creation

real    0m8.024s
user    0m7.929s
sys     0m0.084s

I didn't find the way to return to old format but maybe there are any workarounds or patches.

P.S. I know about gcov's argument --json-format, but lcov1.15 can process either json format or so-called intermediate text format. At the same time gcov9 can output either json format or so-called logfile format files


Solution

  • Further investigation shows that this is because of lcov 1.15 uses JSON:PP module for json parsing. Replacing of JSON:PP to JSON:XS (fast parser) gives required speedup.

    So I use next commands to reach it:

    # patch geninfo to use fast json parser
    > sudo sed -i 's/use JSON::PP/use JSON::XS/g' /usr/local/bin/geninfo
    
    # install perl module
    > sudo cpan install JSON:XS