У вас есть вопрос, который вы задавали, охваченный другими ответами, но вы также задали вопрос в комментариях:
Есть ли какой-нибудь простой метод, который может гарантировать, что я сплю 1us?
Вместо того, чтобы вызывать sleep_for
, получая слот выполнения потока, вы могли бы спать-занято. То есть l oop, пока не пройдет определенное время. Зачастую он получит более точные результаты за счет того, что этот поток ЦП будет непригодным для выполнения чего-либо еще.
Вот один пример с функцией, называемой busy_sleep()
:
// get a rough estimate of how much overhead there is in calling buzy_sleep()
std::chrono::nanoseconds calc_overhead() {
using namespace std::chrono;
constexpr size_t tests = 1001;
constexpr auto timer = 200us;
auto init = [&timer]() {
auto end = steady_clock::now() + timer;
while(steady_clock::now() < end);
};
time_point<steady_clock> start;
nanoseconds dur[tests];
for(auto& d : dur) {
start = steady_clock::now();
init();
d = steady_clock::now() - start - timer;
}
std::sort(std::begin(dur), std::end(dur));
// get the median value or something a little less as in this example:
return dur[tests / 3];
}
// initialize the overhead constant that will be used in busy_sleep()
static const std::chrono::nanoseconds overhead = calc_overhead();
inline void busy_sleep(std::chrono::nanoseconds t) {
auto end = std::chrono::steady_clock::now() + t - overhead;
while(std::chrono::steady_clock::now() < end);
}
Демо
Примечание: это было обновлено после того, как оно было принято, так как я заметил, что иногда подсчет накладных расходов может быть ужасно неправильным. Обновленный пример должен быть меньше fr agile.