gcc/libstdc++-v3/include/std
Cassio Neri 126793971b libstdc++: More efficient is_leap
This patch reimplements std::chrono::year::is_leap().  Leap year check is
ubiquitously implemented (including here) as:

    y % 4 == 0 && (y % 100 != 0 || y % 400 == 0).

The rationale being that testing divisibility by 4 first implies an earlier
return for 75% of the cases, therefore, avoiding the needless calculations of
y % 100 and y % 400. Although this fact is true, it does not take into account
the cost of branching.  This patch, instead, tests divisibility by 100 first:

    (y % 100 != 0 || y % 400 == 0) && y % 4 == 0.

It is certainly counterintuitive that this could be more efficient since among
the three divisibility tests (4, 100 and 400) the one by 100 is the only one
that can never provide a definitive answer and a second divisibility test (by 4
or 400) is always required. However, measurements [1] in x86_64 suggest this is
3x more efficient!  A possible explanation is that checking divisibility by 100
first implies a split in the execution path with probabilities of (1%, 99%)
rather than (25%, 75%) when divisibility by 4 is checked first.  This decreases
the entropy of the branching distribution which seems to help prediction.

Given that y belongs to [-32767, 32767] [time.cal.year.members], a more
efficient algorithm [2] to check divisibility by 100 is used (instead of
y % 100 != 0).  Measurements suggest that this optimization improves performance
by 20%.

The patch adds a test that exhaustively compares the result of this
implementation with the ubiquitous one for all y in [-32767, 32767]. Although
its completeness, the test completes in a matter of seconds.

References:
[1] https://stackoverflow.com/a/60646967/1137388
[2] https://accu.org/journals/overload/28/155/overload155.pdf#page=16

libstdc++-v3/ChangeLog:

	* include/std/chrono (year::is_leap): New implementation.
	* testsuite/std/time/year/2.cc: New test.
2021-02-24 18:25:18 +00:00
..
algorithm Update copyright years. 2021-01-04 10:26:59 +01:00
any Update copyright years. 2021-01-04 10:26:59 +01:00
array Update copyright years. 2021-01-04 10:26:59 +01:00
atomic Update copyright years. 2021-01-04 10:26:59 +01:00
barrier libstdc++: Update copyright dates on new files 2021-01-14 14:25:10 +00:00
bit Update copyright years. 2021-01-04 10:26:59 +01:00
bitset Update copyright years. 2021-01-04 10:26:59 +01:00
charconv Update copyright years. 2021-01-04 10:26:59 +01:00
chrono libstdc++: More efficient is_leap 2021-02-24 18:25:18 +00:00
codecvt Update copyright years. 2021-01-04 10:26:59 +01:00
complex Update copyright years. 2021-01-04 10:26:59 +01:00
concepts Update copyright years. 2021-01-04 10:26:59 +01:00
condition_variable Update copyright years. 2021-01-04 10:26:59 +01:00
coroutine libstdc++: Make coroutine_handle<_Promise>::from_address() noexcept [PR 99021] 2021-02-09 12:31:52 +00:00
deque Update copyright years. 2021-01-04 10:26:59 +01:00
execution Update copyright years. 2021-01-04 10:26:59 +01:00
filesystem Update copyright years. 2021-01-04 10:26:59 +01:00
forward_list Update copyright years. 2021-01-04 10:26:59 +01:00
fstream Update copyright years. 2021-01-04 10:26:59 +01:00
functional Update copyright years. 2021-01-04 10:26:59 +01:00
future Update copyright years. 2021-01-04 10:26:59 +01:00
iomanip Update copyright years. 2021-01-04 10:26:59 +01:00
ios Update copyright years. 2021-01-04 10:26:59 +01:00
iosfwd Update copyright years. 2021-01-04 10:26:59 +01:00
iostream Update copyright years. 2021-01-04 10:26:59 +01:00
istream Update copyright years. 2021-01-04 10:26:59 +01:00
iterator Update copyright years. 2021-01-04 10:26:59 +01:00
latch Update copyright years. 2021-01-04 10:26:59 +01:00
limits Update copyright years. 2021-01-04 10:26:59 +01:00
list Update copyright years. 2021-01-04 10:26:59 +01:00
locale Update copyright years. 2021-01-04 10:26:59 +01:00
map Update copyright years. 2021-01-04 10:26:59 +01:00
memory Update copyright years. 2021-01-04 10:26:59 +01:00
memory_resource Update copyright years. 2021-01-04 10:26:59 +01:00
mutex libstdc++: Add missing return and use reserved name 2021-02-15 15:52:25 +00:00
numbers Update copyright years. 2021-01-04 10:26:59 +01:00
numeric Update copyright years. 2021-01-04 10:26:59 +01:00
optional Update copyright years. 2021-01-04 10:26:59 +01:00
ostream libstdc++: Fix errors when syncbuf is used without RTTI 2021-02-12 14:30:12 +00:00
queue Update copyright years. 2021-01-04 10:26:59 +01:00
random Update copyright years. 2021-01-04 10:26:59 +01:00
ranges Update copyright years. 2021-01-04 10:26:59 +01:00
ratio Update copyright years. 2021-01-04 10:26:59 +01:00
regex Update copyright years. 2021-01-04 10:26:59 +01:00
scoped_allocator Update copyright years. 2021-01-04 10:26:59 +01:00
semaphore Update copyright years. 2021-01-04 10:26:59 +01:00
set Update copyright years. 2021-01-04 10:26:59 +01:00
shared_mutex Update copyright years. 2021-01-04 10:26:59 +01:00
source_location Update copyright years. 2021-01-04 10:26:59 +01:00
span Update copyright years. 2021-01-04 10:26:59 +01:00
sstream Update copyright years. 2021-01-04 10:26:59 +01:00
stack Update copyright years. 2021-01-04 10:26:59 +01:00
stdexcept Update copyright years. 2021-01-04 10:26:59 +01:00
stop_token Update copyright years. 2021-01-04 10:26:59 +01:00
streambuf Update copyright years. 2021-01-04 10:26:59 +01:00
string Update copyright years. 2021-01-04 10:26:59 +01:00
string_view libstdc++: Add string contains member functions for C++2b 2021-01-27 12:37:36 +00:00
syncstream Update copyright years. 2021-01-04 10:26:59 +01:00
system_error Update copyright years. 2021-01-04 10:26:59 +01:00
thread Update copyright years. 2021-01-04 10:26:59 +01:00
tuple Update copyright years. 2021-01-04 10:26:59 +01:00
type_traits Update copyright years. 2021-01-04 10:26:59 +01:00
typeindex Update copyright years. 2021-01-04 10:26:59 +01:00
unordered_map Update copyright years. 2021-01-04 10:26:59 +01:00
unordered_set Update copyright years. 2021-01-04 10:26:59 +01:00
utility Update copyright years. 2021-01-04 10:26:59 +01:00
valarray Update copyright years. 2021-01-04 10:26:59 +01:00
variant Update copyright years. 2021-01-04 10:26:59 +01:00
vector Update copyright years. 2021-01-04 10:26:59 +01:00
version libstdc++: Add string contains member functions for C++2b 2021-01-27 12:37:36 +00:00