forked from bitcoin/bitcoin
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #4201 from kittywhiskers/txEpochs
merge bitcoin#17925, bitcoin#16805: auxilliary backports
- Loading branch information
Showing
7 changed files
with
254 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
// Copyright (c) 2009-2010 Satoshi Nakamoto | ||
// Copyright (c) 2009-2018 The Bitcoin Core developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#ifndef BITCOIN_LOGGING_TIMER_H | ||
#define BITCOIN_LOGGING_TIMER_H | ||
|
||
#include <logging.h> | ||
#include <sync.h> | ||
#include <utiltime.h> | ||
|
||
#include <chrono> | ||
#include <string> | ||
|
||
|
||
namespace BCLog { | ||
|
||
//! RAII-style object that outputs timing information to logs. | ||
template <typename TimeType> | ||
class Timer | ||
{ | ||
public: | ||
//! If log_category is left as the default, end_msg will log unconditionally | ||
//! (instead of being filtered by category). | ||
Timer( | ||
std::string prefix, | ||
std::string end_msg, | ||
BCLog::LogFlags log_category = BCLog::LogFlags::ALL) : | ||
m_prefix(std::move(prefix)), | ||
m_title(std::move(end_msg)), | ||
m_log_category(log_category) | ||
{ | ||
this->Log(strprintf("%s started", m_title)); | ||
m_start_t = GetTime<std::chrono::microseconds>(); | ||
} | ||
|
||
~Timer() | ||
{ | ||
this->Log(strprintf("%s completed", m_title)); | ||
} | ||
|
||
void Log(const std::string& msg) | ||
{ | ||
const std::string full_msg = this->LogMsg(msg); | ||
|
||
if (m_log_category == BCLog::LogFlags::ALL) { | ||
LogPrintf("%s\n", full_msg); | ||
} else { | ||
LogPrint(m_log_category, "%s\n", full_msg); | ||
} | ||
} | ||
|
||
std::string LogMsg(const std::string& msg) | ||
{ | ||
const auto end_time = GetTime<std::chrono::microseconds>() - m_start_t; | ||
if (m_start_t.count() <= 0) { | ||
return strprintf("%s: %s", m_prefix, msg); | ||
} | ||
|
||
std::string units = ""; | ||
float divisor = 1; | ||
|
||
if (std::is_same<TimeType, std::chrono::microseconds>::value) { | ||
units = "μs"; | ||
} else if (std::is_same<TimeType, std::chrono::milliseconds>::value) { | ||
units = "ms"; | ||
divisor = 1000.; | ||
} else if (std::is_same<TimeType, std::chrono::seconds>::value) { | ||
units = "s"; | ||
divisor = 1000. * 1000.; | ||
} | ||
|
||
const float time_ms = end_time.count() / divisor; | ||
return strprintf("%s: %s (%.2f%s)", m_prefix, msg, time_ms, units); | ||
} | ||
|
||
private: | ||
std::chrono::microseconds m_start_t{}; | ||
|
||
//! Log prefix; usually the name of the function this was created in. | ||
const std::string m_prefix{}; | ||
|
||
//! A descriptive message of what is being timed. | ||
const std::string m_title{}; | ||
|
||
//! Forwarded on to LogPrint if specified - has the effect of only | ||
//! outputing the timing log when a particular debug= category is specified. | ||
const BCLog::LogFlags m_log_category{}; | ||
|
||
}; | ||
|
||
} // namespace BCLog | ||
|
||
|
||
#define LOG_TIME_MICROS(end_msg, ...) \ | ||
BCLog::Timer<std::chrono::microseconds> PASTE2(logging_timer, __COUNTER__)(__func__, end_msg, ## __VA_ARGS__) | ||
#define LOG_TIME_MILLIS(end_msg, ...) \ | ||
BCLog::Timer<std::chrono::milliseconds> PASTE2(logging_timer, __COUNTER__)(__func__, end_msg, ## __VA_ARGS__) | ||
#define LOG_TIME_SECONDS(end_msg, ...) \ | ||
BCLog::Timer<std::chrono::seconds> PASTE2(logging_timer, __COUNTER__)(__func__, end_msg, ## __VA_ARGS__) | ||
|
||
|
||
#endif // BITCOIN_LOGGING_TIMER_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
// Copyright (c) 2019 The Bitcoin Core developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#include <logging.h> | ||
#include <logging/timer.h> | ||
#include <test/test_dash.h> | ||
|
||
#include <chrono> | ||
|
||
#include <boost/test/unit_test.hpp> | ||
|
||
BOOST_FIXTURE_TEST_SUITE(logging_tests, BasicTestingSetup) | ||
|
||
BOOST_AUTO_TEST_CASE(logging_timer) | ||
{ | ||
|
||
SetMockTime(1); | ||
auto sec_timer = BCLog::Timer<std::chrono::seconds>("tests", "end_msg"); | ||
SetMockTime(2); | ||
BOOST_CHECK_EQUAL(sec_timer.LogMsg("test secs"), "tests: test secs (1.00s)"); | ||
|
||
SetMockTime(1); | ||
auto ms_timer = BCLog::Timer<std::chrono::milliseconds>("tests", "end_msg"); | ||
SetMockTime(2); | ||
BOOST_CHECK_EQUAL(ms_timer.LogMsg("test ms"), "tests: test ms (1000.00ms)"); | ||
|
||
SetMockTime(1); | ||
auto micro_timer = BCLog::Timer<std::chrono::microseconds>("tests", "end_msg"); | ||
SetMockTime(2); | ||
BOOST_CHECK_EQUAL(micro_timer.LogMsg("test micros"), "tests: test micros (1000000.00μs)"); | ||
|
||
SetMockTime(0); | ||
} | ||
|
||
BOOST_AUTO_TEST_SUITE_END() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters