Skip to content

Commit

Permalink
*: Fix time step backward for Stopwatch::elapsedFromLastTime (#8338)
Browse files Browse the repository at this point in the history
close #8336
  • Loading branch information
JaySon-Huang authored Nov 9, 2023
1 parent b44a3f9 commit c81fd41
Showing 1 changed file with 11 additions and 7 deletions.
18 changes: 11 additions & 7 deletions dbms/src/Common/Stopwatch.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ inline UInt64 clock_gettime_ns(clockid_t clock_type = CLOCK_MONOTONIC)
{
};
clock_gettime(clock_type, &ts);
return UInt64(ts.tv_sec * 1000000000ULL + ts.tv_nsec);
return static_cast<UInt64>(ts.tv_sec * 1000000000ULL + ts.tv_nsec);
}

/// Sometimes monotonic clock may not be monotonic (due to bug in kernel?).
Expand Down Expand Up @@ -64,14 +64,14 @@ class Stopwatch

void start()
{
start_ns = nanoseconds();
start_ns = nanosecondsWithBound(start_ns);
last_ns = start_ns;
is_running = true;
}

void stop()
{
stop_ns = nanoseconds();
stop_ns = nanosecondsWithBound(start_ns);
is_running = false;
}

Expand All @@ -82,14 +82,16 @@ class Stopwatch
last_ns = 0;
is_running = false;
}

void restart() { start(); }
UInt64 elapsed() const { return is_running ? nanoseconds() - start_ns : stop_ns - start_ns; }

UInt64 elapsed() const { return is_running ? nanosecondsWithBound(start_ns) - start_ns : stop_ns - start_ns; }
UInt64 elapsedMilliseconds() const { return elapsed() / 1000000UL; }
double elapsedSeconds() const { return static_cast<double>(elapsed()) / 1000000000ULL; }

UInt64 elapsedFromLastTime()
{
const auto now_ns = nanoseconds();
const auto now_ns = nanosecondsWithBound(last_ns);
if (is_running)
{
auto rc = now_ns - last_ns;
Expand All @@ -100,7 +102,7 @@ class Stopwatch
{
return stop_ns - last_ns;
}
};
}

UInt64 elapsedMillisecondsFromLastTime() { return elapsedFromLastTime() / 1000000UL; }
double elapsedSecondsFromLastTime() { return static_cast<double>(elapsedFromLastTime()) / 1000000000ULL; }
Expand All @@ -112,7 +114,9 @@ class Stopwatch
clockid_t clock_type;
bool is_running = false;

UInt64 nanoseconds() const { return clock_gettime_ns_adjusted(start_ns, clock_type); }
// Get current nano seconds, ensuring the return value is not
// less than `lower_bound`.
UInt64 nanosecondsWithBound(UInt64 lower_bound) const { return clock_gettime_ns_adjusted(lower_bound, clock_type); }
};


Expand Down

0 comments on commit c81fd41

Please sign in to comment.