On Tue, Jun 30, 2026 at 3:26 PM Tomasz Kaminski <[email protected]> wrote:

>
>
> On Tue, Jun 30, 2026 at 3:10 PM Tomasz Kaminski <[email protected]>
> wrote:
>
>>
>>
>> On Tue, Jun 30, 2026 at 2:52 PM Anlai Lu <[email protected]> wrote:
>>
>>> This is v3 of the patch series.  Performance data: see v2 cover letter.
>>> Results are unchanged -- same stack-buffer + __ostream_insert approach.
>>>
>>> Patch 1 is unchanged from v2.
>>>
>>> Changes in Patch 2 from v2:
>>>
>>> - Dropped the format string parameter from __chrono_write.
>>>   _S_empty_fs() is used directly, per Tomasz Kaminski's suggestion.
>>>   All chrono types now share the same two call forms:
>>>     __detail::__chrono_write(__os, __arg);
>>>     __detail::__chrono_write(__os, __arg, __os.getloc());
>>>
>>> - Removed __detail::__empty_fmt: no longer needed.
>>>
>>> - All remaining operator<< that used basic_stringstream now use
>>>   __chrono_write (month_day, month_day_last, month_weekday,
>>>   month_weekday_last, year_month, year_month_day_last,
>>>   year_month_weekday, year_month_weekday_last, sys_days, local_time).
>>>
>>> - The only types not converted: duration (must forward stream flags
>>>   and precision) and local_info (uses __formatter_chrono_info).
>>>
>> I think for local_info the __chrono_write would also give a correct
>> result,
>> the formatter<local_info> uses __formatter_chrono_info and calls to
>> format_to
>> will  pick it up.
>>
> However, now I wonder if it the output fits in 128B buffer, if it does I
> think the reduced
> duplication of the code would be beneficial (the _M_format_to overload for
> local_info)
> is esentially copy of operator<<.
>
However, with update to local_info we are no longer performing any
allocations in
operator<<, so  this will be strictly be a regression in performance. So I
think you made
a right call, to not change it. It would be nice to put summary of that in
the commit message.


> Previously std::format("{}", t) format was implemented by delegating throu
> operator<<,
> and I have reimplemented all the formatters (outside duration) to be
> independed,
> some time ago. And then flipping the logic to use operator<< instead of
> formatter was
> on my TODO list. So thank you for picking this up.
>

>
>>
>>> - Uses std::format_to_n (public API) instead of __do_vformat_to_n.
>>>
>>> Tested on x86_64-linux-gnu.  libstdc++ testsuite (std/time/*) clean.
>>> All converted types verified byte-identical across C, en_US, de_DE,
>>> fr_FR, and zh_CN locales.
>>>
>> Do you see same kind of improvements as with your original patch?
>>
>>>
>>> Anlai Lu (2):
>>>   libstdc++: Add stream state tests for chrono operator<<
>>>   libstdc++: Use __chrono_write via _S_empty_fs for chrono ostream
>>>     insertion
>>>
>>>  libstdc++-v3/include/bits/chrono_io.h         | 227 ++++--------------
>>>  .../testsuite/std/time/ostream_insert.cc      | 163 +++++++++++++
>>>  2 files changed, 212 insertions(+), 178 deletions(-)
>>>  create mode 100644 libstdc++-v3/testsuite/std/time/ostream_insert.cc
>>>
>>> --
>>> 2.34.1
>>>
>>>

Reply via email to