[libcamera-devel] [PATCH] cam: convert to libfmt

Kieran Bingham kieran.bingham at ideasonboard.com
Sun May 22 12:08:27 CEST 2022


Quoting Laurent Pinchart (2022-05-10 14:04:57)
> Hi Eric,
> 
> On Tue, May 10, 2022 at 01:59:37PM +0100, Eric Curtin via libcamera-devel wrote:
> > On Tue, 10 May 2022 at 11:10, Kieran Bingham via libcamera-devel wrote:
> > > Quoting Naushir Patuck (2022-05-10 10:49:14)
> > > > On Tue, 10 May 2022 at 08:16, Tomi Valkeinen via libcamera-devel wrote:
> > > >
> > > > > This is just a conversation starter, not for merging. I really like
> > > > > libfmt, and I really hate the C++ stream-based string formatting. libfmt
> > > > > is the first library I add to any new C++ project I make.
> > > > >
> > > > > You can find more information about libfmt from:
> > > > >
> > > > > https://github.com/fmtlib/fmt
> > > > > https://fmt.dev/latest/index.html
> > > > >
> > > > > This patch is just a crude conversion with ugly macros to showcase what
> > > > > the formatting code might look like.
> > > > >
> > > > > libfmt pages suggest that libfmt would be faster and smaller (exe size)
> > > > > than iostreams, but for the size it didn't seem to be true in cam's case
> > > > > as the tests below show. However, simple prints did reduce the exe size,
> > > > > but the few more complex ones increased the size.
> > > > >
> > > > > Size tests with gcc 11.2.0-19ubuntu1
> > > > >
> > > > > - Without libfmt
> > > > >
> > > > > debug           3523400
> > > > > debug lto       3269368
> > > > > release         223056
> > > > > release lto     172280
> > > > >
> > > > > - With libfmt
> > > > >
> > > > > debug           4424256
> > > > > debug lto       4143840
> > > > > release         303952
> > > > > release lto     252640
> > > > >
> > > > > Above shows that cam's size clearly increases with libfmt. However, the
> > > > > increase really comes only from one case, the use of fmt::memory_buffer
> > > > > and std::back_inserter. Converting that code to use fmt::format() and
> > > > > naive string append gives:
> > > > >
> > > > > release with string append      233680
> > > > > release lto with string append  186936
> > > > >
> > > > > Also, if I add another use of fmt::memory_buffer and std::back_inserter
> > > > > to another file, I see much less increase in the size:
> > > > >
> > > > > release lto with two uses of memory_buffer, back_inserter       256736
> > > > >
> > > > > Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ideasonboard.com>
> > > >
> > > > For what it's worth, I absolutely loathe formatting in std iostream, and
> > > > libfmt is a wonderful alternative.
> > > > It also is close enough to the C++20 std::format implementation that
> > > > eventual porting would be low effort.  So I am all for this change :)
> 
> It's going to take a while before we can switch to C++20, but I'm
> looking forward to it (and before that to some of the C++17 features
> too, it would be nice to use std::optional in the public API).


So, I've just seen as Christian said - we already do!

It's used by color space ..


So we're faced with either reverting, or rolling back on the color-space
change, or pushing forwards with C++17 on the public-api.

Maybe this deserves it's own thread...

--
Kieran


> 
> > I am all in for this change also, personally I would have changed to
> > printf for now
> > to have one less dependency (also an easy port to C++20 std::format). The
> > dependency list is getting large, I noticed a build of mine failing
> > recently because
> > I didn't have libyaml.
> 
> I've posted a patch that falls back to a subproject in that case. Would
> you be able to give it a try ?
> 
> > But std::format and libfmt are quite fast and anything is better than
> > streams so +1.
> > 
> > > I've never used (yet) {fmt}, but I've only heard good things about
> > > performance, and of course it's headed into the standard, so I also
> > > think there is some good merit to be found in this development.
> 
> -- 
> Regards,
> 
> Laurent Pinchart


More information about the libcamera-devel mailing list