gpt4 book ai didi

c - getrusage(RUSAGE_THREAD, &r_usage) 中的用户CPU时间和系统CPU时间具体是指什么?

转载 作者:太空狗 更新时间:2023-10-29 11:41:51 31 4
gpt4 key购买 nike

所以我想知道当前线程到目前为止执行的时间。我正在尝试为此使用 getrusage(RUSAGE_THREAD, &r_usage);。这是我的困惑:

1- 此函数返回的时间是否包括线程被阻塞(例如,在条件变量上)或调度的时间?

2-线程因其他原因被阻塞的时间如何,例如阻塞 I/O?

3- 我可以提高时间精度以使 getrusage(RUSAGE_THREAD, &r_usage); 以纳秒为单位返回吗?

非常感谢!

最佳答案

似乎很难相信花在阻塞上的时间(无论出于何种原因)会被计为花在执行上的时间——但如果确实如此,让我们做一个快速实验来了解一下:

#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <iostream>
#include <iomanip>

std::ostream &operator<<(std::ostream &os, timeval const &t) {
return os << t.tv_sec << '.' << std::setw(6) << std::setfill('0') << t.tv_usec << std::setfill(' ');
}

int main() {
rusage r;

getrusage(RUSAGE_THREAD, &r);
std::cout << r.ru_utime << " [" << r.ru_stime << "]\n";
sleep(10);
getrusage(RUSAGE_THREAD, &r);
std::cout << r.ru_utime << " [" << r.ru_stime << "]\n";
}

结果:

0.000000 [0.000000]
0.000000 [0.000000]

因此, sleep 时间不收费。我们可以用互斥体做类似的测试:

#include <sys/time.h>
#include <sys/resource.h>
#include <iostream>
#include <iomanip>
#include <thread>
#include <mutex>

using namespace std::literals;

std::ostream &operator<<(std::ostream &os, timeval const &t) {
return os << t.tv_sec << '.' << std::setw(6) << std::setfill('0') << t.tv_usec << std::setfill(' ');
}

int main() {
rusage r;

getrusage(RUSAGE_THREAD, &r);
std::cout << r.ru_utime << " [" << r.ru_stime << "]\n" << std::flush;

std::mutex m;
m.try_lock(); // ensure mutex is locked

// create thread to unlock mutex after 5 seconds:
auto t = std::thread([&]{ std::this_thread::sleep_for(5s); m.unlock(); });

// wait for mutex to be unlocked
m.lock();

// re-check resource usage
getrusage(RUSAGE_THREAD, &r);
std::cout << r.ru_utime << " [" << r.ru_stime << "]\n";
t.join();
}

这给出了类似的结果。我没有费心为条件变量重复它​​,但我会很惊讶地看到它的不同结果(condvar 总是与互斥量相关联,并且它是您真正等待的互斥量)。

尝试测试每种可能的 I/O 不太实际,但过去的经验表明它也是如此:阻塞等待 I/O 的时间不被视为执行时间。

就精度而言,我认为理论上您可以将精度提高到纳秒范围,但这需要重写内核,而不仅仅是拨动开关或调用不同的函数。实际上,即使那样您是否能够获得更准确的很多还有很多问题。如果您需要纳秒级精度,这可能不是适合这项工作的工具。

关于c - getrusage(RUSAGE_THREAD, &r_usage) 中的用户CPU时间和系统CPU时间具体是指什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42302622/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com