regression in C++ parsing performance between 4.9.3 and 5.3.1

Pádraig Brady P@draigBrady.com
Mon Mar 28 12:58:00 GMT 2016


The attached shell script will generate a larger version
of the following:

constexpr bool static_str_equal(const char* x, const char* y) {
   return (*x == 0 || *y == 0) ?
     (*x == *y) :
     ((*x == *y) && static_str_equal(x + 1, y + 1));
}
int main(void)
{
  static_assert( !static_str_equal("unspecified1", "unspecified"), "");
}

There is a significant slow down and increase in ram usage
compiling that, between gcc 4.9.3 and 5.3.1 (20151207):

$ sh cstrcmp.sh > cstrcmp.cpp
$ ~/gcc-4.9.3/g++ -ftime-report --std=gnu++11 cstrcmp.cpp

Execution times (seconds)
  phase setup             :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.01 ( 1%) wall    1445 kB ( 1%) ggc
  phase parsing           :   0.91 (100%) usr   0.16 (100%) sys   1.08 (99%) wall  149089 kB (99%) ggc
  |name lookup            :   0.03 ( 3%) usr   0.00 ( 0%) sys   0.02 ( 2%) wall      89 kB ( 0%) ggc
  |overload resolution    :   0.01 ( 1%) usr   0.00 ( 0%) sys   0.02 ( 2%) wall     628 kB ( 0%) ggc
  preprocessing           :   0.02 ( 2%) usr   0.05 (31%) sys   0.04 ( 4%) wall    2048 kB ( 1%) ggc
  parser (global)         :   0.02 ( 2%) usr   0.03 (19%) sys   0.08 ( 7%) wall   16178 kB (11%) ggc
  parser function body    :   0.87 (96%) usr   0.08 (50%) sys   0.96 (88%) wall  130855 kB (87%) ggc
  TOTAL                 :   0.91             0.16             1.09             150594 kB

$ g++ -ftime-report --std=gnu++11 cstrcmp.cpp  # default fedora version

Execution times (seconds)
  phase setup             :   0.00 ( 0%) usr   0.00 ( 0%) sys   0.00 ( 0%) wall    1408 kB ( 0%) ggc
  phase parsing           :   1.90 (99%) usr   0.26 (100%) sys   2.16 (100%) wall  469089 kB (100%) ggc
  phase opt and generate  :   0.01 ( 1%) usr   0.00 ( 0%) sys   0.01 ( 0%) wall      53 kB ( 0%) ggc
  |name lookup            :   0.04 ( 2%) usr   0.00 ( 0%) sys   0.05 ( 2%) wall      93 kB ( 0%) ggc
  |overload resolution    :   0.01 ( 1%) usr   0.00 ( 0%) sys   0.00 ( 0%) wall     628 kB ( 0%) ggc
  garbage collection      :   0.20 (10%) usr   0.02 ( 8%) sys   0.21 (10%) wall       0 kB ( 0%) ggc
  preprocessing           :   0.01 ( 1%) usr   0.05 (19%) sys   0.08 ( 4%) wall    2048 kB ( 0%) ggc
  parser (global)         :   0.02 ( 1%) usr   0.04 (15%) sys   0.05 ( 2%) wall   16181 kB ( 3%) ggc
  parser function body    :   1.67 (87%) usr   0.15 (58%) sys   1.82 (84%) wall  450852 kB (96%) ggc
  integrated RA           :   0.01 ( 1%) usr   0.00 ( 0%) sys   0.01 ( 0%) wall      24 kB ( 0%) ggc
  TOTAL                 :   1.91             0.26             2.17             470569 kB

Note I compiled the gcc 5 branch at 20160302 with the same results.

thanks,
Pádraig
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cstrcmp.sh
Type: application/x-sh
Size: 327 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc/attachments/20160328/86bff492/attachment.sh>


More information about the Gcc mailing list