https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80826

            Bug ID: 80826
           Summary: Compilation Time for many of std::map insertions
           Product: gcc
           Version: 4.8.5
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: seanthesheep1 at hotmail dot com
  Target Milestone: ---

Created attachment 41388
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=41388&action=edit
test code

Hi,

I have some code, which I am attempting to generate from file, which creates a
std::map<std::string, int> and inserts 6000+ pairs into it.

Here is sample code what I mean:

    #include <iostream>
    #include <stdlib.h>
    #include <map>
    #include <string>

    int main ()
    {

    std::map<std::string, int> mMap;
    mMap.insert (std::pair<std::string, int>("1", 1));
    mMap.insert (std::pair<std::string, int>("2", 2));
    mMap.insert (std::pair<std::string, int>("3", 3));
    mMap.insert (std::pair<std::string, int>("4", 4));
    mMap.insert (std::pair<std::string, int>("5", 5));
    mMap.insert (std::pair<std::string, int>("6", 6));
    mMap.insert (std::pair<std::string, int>("7", 7));
    mMap.insert (std::pair<std::string, int>("8", 8));
    mMap.insert (std::pair<std::string, int>("9", 9));
    mMap.insert (std::pair<std::string, int>("10", 10));
    mMap.insert (std::pair<std::string, int>("11", 11));
    mMap.insert (std::pair<std::string, int>("12", 12));
    mMap.insert (std::pair<std::string, int>("13", 13));
    mMap.insert (std::pair<std::string, int>("14", 14));
    //...
    mMap.insert (std::pair<std::string, int>("6105", 6105));
    mMap.insert (std::pair<std::string, int>("6106", 6106));
    mMap.insert (std::pair<std::string, int>("6107", 6107));
    mMap.insert (std::pair<std::string, int>("6108", 6108));
    mMap.insert (std::pair<std::string, int>("6109", 6109));
    mMap.insert (std::pair<std::string, int>("6110", 6110));
    mMap.insert (std::pair<std::string, int>("6111", 6111));
    }

Note: the values above are for demonstration purposes and not what I am
actually using.

The g++ compilation time for this with no optimization is ~13 seconds, which is
surprising long. 

    $ time g++ -g -ftime-report  test.cpp

        Execution times (seconds)
         garbage collection    :   0.73 ( 6%) usr   0.00 ( 0%) sys   0.73 ( 6%)
wall       0 kB ( 0%) ggc
         callgraph construction:   0.55 ( 5%) usr   0.04 ( 7%) sys   0.60 ( 5%)
wall   12476 kB ( 2%) ggc
         callgraph optimization:   0.01 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%)
wall       0 kB ( 0%) ggc
         cfg cleanup           :   0.41 ( 3%) usr   0.00 ( 0%) sys   0.41 ( 3%)
wall       0 kB ( 0%) ggc
         trivially dead code   :   0.09 ( 1%) usr   0.00 ( 0%) sys   0.08 ( 1%)
wall       0 kB ( 0%) ggc
         life analysis         :   0.61 ( 5%) usr   0.01 ( 2%) sys   0.62 ( 5%)
wall   16256 kB ( 2%) ggc
         life info update      :   0.29 ( 2%) usr   0.00 ( 0%) sys   0.29 ( 2%)
wall    3439 kB ( 0%) ggc
         alias analysis        :   0.20 ( 2%) usr   0.00 ( 0%) sys   0.20 ( 2%)
wall    4102 kB ( 1%) ggc
         register scan         :   0.07 ( 1%) usr   0.00 ( 0%) sys   0.07 ( 1%)
wall       0 kB ( 0%) ggc
         rebuild jump labels   :   0.11 ( 1%) usr   0.00 ( 0%) sys   0.10 ( 1%)
wall       0 kB ( 0%) ggc
         preprocessing         :   0.11 ( 1%) usr   0.07 (12%) sys   0.19 ( 2%)
wall    1452 kB ( 0%) ggc
         parser                :   0.77 ( 7%) usr   0.18 (31%) sys   0.86 ( 7%)
wall  123814 kB (18%) ggc
         name lookup           :   0.14 ( 1%) usr   0.10 (17%) sys   0.30 ( 2%)
wall    8390 kB ( 1%) ggc
         inline heuristics     :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%)
wall       0 kB ( 0%) ggc
         integration           :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%)
wall       0 kB ( 0%) ggc
         tree gimplify         :   0.23 ( 2%) usr   0.01 ( 2%) sys   0.25 ( 2%)
wall   17802 kB ( 3%) ggc
         tree eh               :   0.21 ( 2%) usr   0.03 ( 5%) sys   0.23 ( 2%)
wall   89644 kB (13%) ggc
         tree CFG construction :   0.21 ( 2%) usr   0.02 ( 3%) sys   0.23 ( 2%)
wall   83144 kB (12%) ggc
         tree CFG cleanup      :   0.26 ( 2%) usr   0.00 ( 0%) sys   0.26 ( 2%)
wall     512 kB ( 0%) ggc
         expand                :   1.58 (13%) usr   0.03 ( 5%) sys   1.60 (13%)
wall  204964 kB (29%) ggc
         varconst              :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%)
wall      97 kB ( 0%) ggc
         jump                  :   0.31 ( 3%) usr   0.01 ( 2%) sys   0.34 ( 3%)
wall   29427 kB ( 4%) ggc
         branch prediction     :   0.13 ( 1%) usr   0.00 ( 0%) sys   0.14 ( 1%)
wall       0 kB ( 0%) ggc
         flow analysis         :   0.09 ( 1%) usr   0.00 ( 0%) sys   0.10 ( 1%)
wall       0 kB ( 0%) ggc
         mode switching        :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%)
wall       0 kB ( 0%) ggc
         local alloc           :   0.94 ( 8%) usr   0.01 ( 2%) sys   0.95 ( 8%)
wall    4134 kB ( 1%) ggc
         global alloc          :   2.39 (20%) usr   0.05 ( 8%) sys   2.45 (20%)
wall   74298 kB (11%) ggc
         flow 2                :   0.34 ( 3%) usr   0.00 ( 0%) sys   0.33 ( 3%)
wall   15547 kB ( 2%) ggc
         final                 :   0.93 ( 8%) usr   0.03 ( 5%) sys   0.95 ( 8%)
wall    4141 kB ( 1%) ggc
         symout                :   0.01 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 0%)
wall    1846 kB ( 0%) ggc
         TOTAL                 :  11.75             0.59            12.35      
      697454 kB

        real    0m13.691s
        user    0m12.891s
        sys     0m0.684s


If I add the -O1 optimization flag to the compiler, it takes an extreme amount
of time and also uses a lot of memory during compiling. It is still running
(after 36+ minutes) but here is the output from top so far:

    PID USER      PR  NI  VIRT SWAP  RES CODE DATA  SHR S %CPU %MEM    TIME+ 
COMMAND
    11174 me      25   0 4658m  90m 4.5g 6416 4.5g  10m R 100.0 12.6  36:00.14
/usr/libexec/gcc/x86_64-redhat-linux/4.1.2/cc1plus -quiet -D_GNU_SOURCE
test.cpp -quiet -dumpbase test.cpp -mtune=generic -auxbase test -g -O1
-ftime-report -o /tmp/ccgPeF5L.s

What is causing this to happen?

I cannot use C++ 11. I've checked gcc versions 4.1.2, 4.4.4 and 4.8.5.

I know I could just have a function that reads the values from a file at run
time and insert them into the map but I would like to understand the problem
first.

Reply via email to