1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 06:07:44 +00:00

AK+Tests: Replace years_to_days_since_epoch by near-instant function

This solves half the problem of #12729. Note that the inverse function
time_to_tm() in LibC/time.cpp still uses a slow for-loop.

See also #13138
This commit is contained in:
Ben Wiederhake 2023-01-01 17:08:05 +01:00 committed by Tim Flynn
parent 60ee695287
commit 7a69219a35
2 changed files with 103 additions and 8 deletions

View file

@ -317,8 +317,7 @@ TEST_CASE(years_to_days_since_epoch_points)
BENCHMARK_CASE(years_to_days_since_epoch_benchmark)
{
// This benchmark takes consistently about 295±1 ms on Linux, and roughly 2300 ms on Serenity.
// TODO: Computing the amount of days should never take dozens of milliseconds.
// This benchmark takes consistently "0ms" on Linux, and "0ms" on Serenity.
for (size_t i = 0; i < 100; ++i) {
int actual_days = years_to_days_since_epoch(-5877640);
(void)actual_days;
@ -326,6 +325,70 @@ BENCHMARK_CASE(years_to_days_since_epoch_benchmark)
}
}
TEST_CASE(div_floor_by)
{
EXPECT_EQ(AK::Detail::floor_div_by<4>(-5), -2);
EXPECT_EQ(AK::Detail::floor_div_by<4>(-4), -1);
EXPECT_EQ(AK::Detail::floor_div_by<4>(-3), -1);
EXPECT_EQ(AK::Detail::floor_div_by<4>(-2), -1);
EXPECT_EQ(AK::Detail::floor_div_by<4>(-1), -1);
EXPECT_EQ(AK::Detail::floor_div_by<4>(+0), +0);
EXPECT_EQ(AK::Detail::floor_div_by<4>(+1), +0);
EXPECT_EQ(AK::Detail::floor_div_by<4>(+2), +0);
EXPECT_EQ(AK::Detail::floor_div_by<4>(+3), +0);
EXPECT_EQ(AK::Detail::floor_div_by<4>(+4), +1);
EXPECT_EQ(AK::Detail::floor_div_by<4>(+5), +1);
EXPECT_EQ(AK::Detail::floor_div_by<4>(+6), +1);
EXPECT_EQ(AK::Detail::floor_div_by<4>(+7), +1);
EXPECT_EQ(AK::Detail::floor_div_by<4>(+8), +2);
}
TEST_CASE(mod_zeros_in_range)
{
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(0, 0), 0);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(0, 1), 1);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(0, 2), 1);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(0, 3), 1);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(0, 4), 1);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(0, 5), 2);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(0, 6), 2);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(1, 1), 0);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(1, 2), 0);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(1, 3), 0);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(1, 4), 0);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(1, 5), 1);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(1, 6), 1);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(2, 2), 0);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(2, 3), 0);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(2, 4), 0);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(2, 5), 1);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(2, 6), 1);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(3, 3), 0);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(3, 4), 0);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(3, 5), 1);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(3, 6), 1);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(4, 4), 0);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(4, 5), 1);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(4, 6), 1);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(5, 5), 0);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(5, 6), 0);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(6, 6), 0);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(-5, 3), 2);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(-4, 3), 2);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(-3, 3), 1);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(-2, 3), 1);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(-1, 3), 1);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(-0, 3), 1);
EXPECT_EQ(AK::Detail::mod_zeros_in_range<4>(+1, 3), 0);
}
TEST_CASE(years_to_days_since_epoch_span)
{
auto test_data_start_year = 1900;