Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

binary executable size increase: gcc-9 vs gcc-10 #1675

Closed
sheerluck opened this issue May 9, 2020 · 4 comments
Closed

binary executable size increase: gcc-9 vs gcc-10 #1675

sheerluck opened this issue May 9, 2020 · 4 comments

Comments

@sheerluck
Copy link

I use fmt in some simple toy project.
I noticed increase of binary executable size:

  • after compilation with gcc-9 the executable has 427K
  • after compilation with gcc-10 the executable has 472K

I used https://github.com/google/bloaty this way:

$ bloaty -n 0 -d symbols exe-9 > txt-9
$ bloaty -n 0 -d symbols exe-10 > txt-10

This is excerpt from txt-9 sorted by name:

    FILE SIZE        VM SIZE    
 --------------  -------------- 
   1.2%  5.30Ki   1.6%  5.08Ki    decltype(fp(0)) fmt::v6::visit_format_arg<fmt::v6::arg_formatter<fmt::v6::buffer_range<char> >, fmt::v6::basic_format_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >(fmt::v6::arg_formatter<fmt::v6::buffer_range<char> >&&, fmt::v6::basic_format_arg<fmt::v6::basic_format_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> > const&)
   0.3%  1.16Ki   0.3%     984    decltype(fp(0)) fmt::v6::visit_format_arg<fmt::v6::internal::arg_converter<long, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >(fmt::v6::internal::arg_converter<long, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >&&, fmt::v6::basic_format_arg<fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> > const&)

   2.6%  11.2Ki   3.5%  11.0Ki    std::back_insert_iterator<fmt::v6::internal::buffer<char> > fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char>::format<fmt::v6::printf_arg_formatter<fmt::v6::buffer_range<char> > >() (.constprop.0)
   0.3%  1.14Ki   0.3%     979    std::back_insert_iterator<fmt::v6::internal::buffer<char> > fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char>::format<fmt::v6::printf_arg_formatter<fmt::v6::buffer_range<char> > >() (.constprop.0.cold)
   0.2%     883   0.2%     722    std::back_insert_iterator<fmt::v6::internal::buffer<char> > fmt::v6::internal::arg_formatter_base<fmt::v6::buffer_range<char>, fmt::v6::internal::error_handler>::operator()<int, 0>(int)

 100.0%   427Ki 100.0%   314Ki    TOTAL

This is excerpt from txt-10 sorted by name:

    FILE SIZE        VM SIZE    
 --------------  -------------- 
   3.1%  14.5Ki   4.0%  14.3Ki    decltype(fp(0)) fmt::v6::visit_format_arg<fmt::v6::arg_formatter<fmt::v6::buffer_range<char> >, fmt::v6::basic_format_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >(fmt::v6::arg_formatter<fmt::v6::buffer_range<char> >&&, fmt::v6::basic_format_arg<fmt::v6::basic_format_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> > const&)
   0.2%  1.03Ki   0.2%     848    decltype(fp(0)) fmt::v6::visit_format_arg<fmt::v6::internal::arg_converter<long, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >(fmt::v6::internal::arg_converter<long, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >&&, fmt::v6::basic_format_arg<fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> > const&)
   0.2%  1.03Ki   0.2%     848    decltype(fp(0)) fmt::v6::visit_format_arg<fmt::v6::internal::arg_converter<long long, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >(fmt::v6::internal::arg_converter<long long, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >&&, fmt::v6::basic_format_arg<fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> > const&)
   0.2%  1.13Ki   0.3%     950    decltype(fp(0)) fmt::v6::visit_format_arg<fmt::v6::internal::arg_converter<short, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >(fmt::v6::internal::arg_converter<short, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >&&, fmt::v6::basic_format_arg<fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> > const&)
   0.2%  1.13Ki   0.3%     950    decltype(fp(0)) fmt::v6::visit_format_arg<fmt::v6::internal::arg_converter<signed char, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >(fmt::v6::internal::arg_converter<signed char, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >&&, fmt::v6::basic_format_arg<fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> > const&)
   0.2%     803   0.2%     591    decltype(fp(0)) fmt::v6::visit_format_arg<fmt::v6::internal::printf_width_handler<char>, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >(fmt::v6::internal::printf_width_handler<char>&&, fmt::v6::basic_format_arg<fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> > const&)
   0.2%     803   0.2%     586    decltype(fp(0)) fmt::v6::visit_format_arg<fmt::v6::internal::printf_width_handler<char>, fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> >(fmt::v6::internal::printf_width_handler<char>&&, fmt::v6::basic_format_arg<fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char> > const&) (.cold)

   2.8%  13.0Ki   3.6%  12.8Ki    std::back_insert_iterator<fmt::v6::internal::buffer<char> > fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char>::format<fmt::v6::printf_arg_formatter<fmt::v6::buffer_range<char> > >() (.constprop.0)
   0.1%     573   0.1%     381    std::back_insert_iterator<fmt::v6::internal::buffer<char> > fmt::v6::basic_printf_context<std::back_insert_iterator<fmt::v6::internal::buffer<char> >, char>::format<fmt::v6::printf_arg_formatter<fmt::v6::buffer_range<char> > >() (.constprop.0.cold)
   0.1%     334   0.0%     173    std::back_insert_iterator<fmt::v6::internal::buffer<char> > fmt::v6::internal::arg_formatter_base<fmt::v6::buffer_range<char>, fmt::v6::internal::error_handler>::operator()<double, 0>(double)
   0.1%     334   0.0%     173    std::back_insert_iterator<fmt::v6::internal::buffer<char> > fmt::v6::internal::arg_formatter_base<fmt::v6::buffer_range<char>, fmt::v6::internal::error_handler>::operator()<float, 0>(float)
   0.9%  4.36Ki   1.2%  4.20Ki    std::back_insert_iterator<fmt::v6::internal::buffer<char> > fmt::v6::internal::arg_formatter_base<fmt::v6::buffer_range<char>, fmt::v6::internal::error_handler>::operator()<int, 0>(int)
   0.1%     354   0.1%     193    std::back_insert_iterator<fmt::v6::internal::buffer<char> > fmt::v6::internal::arg_formatter_base<fmt::v6::buffer_range<char>, fmt::v6::internal::error_handler>::operator()<long double, 0>(long double)
   0.7%  3.13Ki   0.8%  2.97Ki    std::back_insert_iterator<fmt::v6::internal::buffer<char> > fmt::v6::internal::arg_formatter_base<fmt::v6::buffer_range<char>, fmt::v6::internal::error_handler>::operator()<unsigned int, 0>(unsigned int)

 100.0%   472Ki 100.0%   356Ki    TOTAL

I don't know if anything can to be done in fmt -- this may be gcc's fault

@vitaut
Copy link
Contributor

vitaut commented May 9, 2020

What {fmt} version and exact compile/link flags did you use?

@sheerluck
Copy link
Author

{fmt} version 6.2.0
CMakeLists.txt:

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS_RELEASE "-march=native -mtune=native -O3 -mmmx -msse -msse2 -msse3 -pedantic -Wextra -Wshadow -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -fgraphite-identity -floop-nest-optimize -fdevirtualize-at-ltrans -fipa-pta -fno-semantic-interposition -flto=9 -fuse-linker-plugin -pipe -falign-functions=32")

@vitaut
Copy link
Contributor

vitaut commented May 9, 2020

I recommend using the master branch which has some major library size optimizations. Also make sure to disable assertions by defining NDEBUG. As for difference between gcc 10 and 9, I'm not sure - probably some inlining heuristic changed.

@vitaut vitaut closed this as completed May 9, 2020
@vitaut
Copy link
Contributor

vitaut commented Jul 4, 2020

tmartin-gh added a commit to tmartin-gh/fmt that referenced this issue Mar 17, 2023
tmartin-gh added a commit to tmartin-gh/fmt that referenced this issue Mar 17, 2023
vitaut pushed a commit that referenced this issue Mar 17, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants