- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我想知道当前线程到目前为止执行的时间。我正在尝试为此使用 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/
所以我想知道当前线程到目前为止执行的时间。我正在尝试为此使用 getrusage(RUSAGE_THREAD, &r_usage);。这是我的困惑: 1- 此函数返回的时间是否包括线程被阻塞(例如,在
我是一名优秀的程序员,十分优秀!