我正在尝试打印timeval类型的值.实际上我可以打印它,但我得到以下警告:
此行有多个标记
程序编译并打印出值,但我想知道我做错了什么.谢谢.
printf("%ld.%6ld\n",usage.ru_stime);
printf("%ld.%6ld\n",usage.ru_utime);
Run Code Online (Sandbox Code Playgroud)
用法类型
typedef struct{
struct timeval ru_utime; /* user time used */
struct timeval ru_stime; /* system time used */
long ru_maxrss; /* maximum resident set size */
long ru_ixrss; /* integral shared memory size */
long ru_idrss; /* integral unshared data size */
long ru_isrss; /* integral unshared stack size */
long ru_minflt; /* page reclaims */
long ru_majflt; /* page faults */
long ru_nswap; /* swaps */
long ru_inblock; /* block …Run Code Online (Sandbox Code Playgroud) 这是来自 man getrusage
struct rusage {
struct timeval ru_utime; /* user time used */
struct timeval ru_stime; /* system time used */
long ru_maxrss; /* maximum resident set size */
long ru_ixrss; /* integral shared memory size */
long ru_idrss; /* integral unshared data size */
long ru_isrss; /* integral unshared stack size */
long ru_minflt; /* page reclaims */
long ru_majflt; /* page faults */
long ru_nswap; /* swaps */
long ru_inblock; /* block input operations */
long ru_oublock; …Run Code Online (Sandbox Code Playgroud) 我想测量执行一些代码所需的系统时间.要做到这一点,我知道我会在两次调用getrusage()之间将所述代码夹在中间,但是我得到了一些意想不到的结果......
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdio.h>
int main() {
struct rusage usage;
struct timeval start, end;
int i, j, k = 0;
getrusage(RUSAGE_SELF, &usage);
start = usage.ru_stime;
for (i = 0; i < 10000; i++) {
/* Double loop for more interesting results. */
for (j = 0; j < 10000; j++) {
k += 20;
}
}
getrusage(RUSAGE_SELF, &usage);
end = usage.ru_stime;
printf("Started at: %ld.%lds\n", start.tv_sec, start.tv_usec);
printf("Ended at: %ld.%lds\n", end.tv_sec, end.tv_usec);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望这会产生两个不同的数字,但唉!看到我的电脑想了一两秒后,这就是结果: …
这段代码
void print_usage(char * msg)
{
struct rusage usage;
getrusage(RUSAGE_SELF, &usage);
printf("Limits: %s\n", msg);
printf(" %s, %li\n", " maximum resident set size " , usage.ru_maxrss );
printf(" %s, %li\n", " integral shared memory size " , usage.ru_ixrss );
printf(" %s, %li\n", " integral unshared data size " , usage.ru_idrss );
printf(" %s, %li\n", " integral unshared stack size " , usage.ru_isrss );
printf(" %s, %li\n", " page reclaims " , usage.ru_minflt );
printf(" %s, %li\n", " page faults " , …Run Code Online (Sandbox Code Playgroud) 我试图获取Ubuntu上进程消耗的CPU时间.据我所知,有两个函数可以完成这项工作:getrusage()和clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&tp).在我的代码中,在clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&tp)之后立即调用getrusage(),总是会得到不同的结果.
谁能帮助我了解哪个功能提供更高的分辨率,以及这些功能有哪些优点/缺点?
谢谢.
在一个调用getrusage()两次以通过减法获得任务时间的程序中,我曾经看到一个断言,说任务时间应该是非负的,失败。当然,这不能轻易地重现,尽管我可以编写一个专门的程序来更容易地重现它。
我试图找到一种getrusage()增加执行的保证,但我的系统(Linux on x86-64)上的手册页和这个独立于系统的描述都没有明确说明这一点。
该行为是在具有多个内核且运行 NTP 的物理计算机上观察到的。
我应该报告我正在使用的操作系统的错误吗?当我期望getrusage()随着时间的推移而增加时,我的要求是否太多了?
我test.cpp在 macOS Sierra 上编译并运行了以下 C++ 代码。
#include <iostream>
#include <sys/resource.h>
using namespace std;
int main() {
int a = 1;
struct rusage r_usage;
getrusage(RUSAGE_SELF, &r_usage);
cout << "Memory usage = " << r_usage.ru_maxrss << endl;
int b = 2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后得到:
? Desktop git:(master) ? ./test
Memory usage = 663552
Run Code Online (Sandbox Code Playgroud)
然后我发现这里的单位ru_maxrss是千字节 ,所以程序使用了663552千字节?但我只是创建了一个整数。
另一个问题是:ru_maxrss计数int b = 2吗?或者它只是在行调用之前计算内存使用情况ru_maxrss。
在执行之前,程序的编译是否会在缓存中存储一些数据?
我在Linux中编写了一个C程序,它在一个线程中启动Sublime Text,并在另一个线程中进行手动系统调用.(我将解释为什么我最后这样做,因为这与这个问题无关)
我正在使用getrusage来测量I/O的数量.
我的问题是,在编译之后,I/O输入的数量会减少很多.换句话说,如果我不在编译和执行之间释放缓存和内存,则I/O的数量会减少很多.为什么以及如何发生这种情况?请参阅以下案例.
案例A - 1)编译2)执行
> $ gcc pmulti.c -o pmulti
> $ ./pmulti
<result>
I/O Input: 632 Output: 0
Run Code Online (Sandbox Code Playgroud)
情况B 1)编译2)空闲内存和缓存 3)执行
> $ gcc pmulti.c -o pmulti
> # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
> $ ./pmulti
<result>
I/O Input: 1400 Output: 0
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,输入的数量是案例A <案例B.这必须意味着在编译期间发生了某些事情,并且它受到释放缓存和内存的影响.
为什么以及如何发生这种情况?我在哪里可以了解更多相关信息?
完整代码:https://pastebin.com/R6v00LLW
我的代码的缩写版本:
struct rusage usage;
void *func1(void *vargp)
{
/* Manual System …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用getrusage(.)和最大驻留集大小 (maxrss) 来检查内存泄漏。但是,当我故意尝试造成泄漏时,maxrss 不会改变。也许我对 maxrss 的理解不够深入。这是代码:
#include <iostream>
#include <sys/time.h>
#include <sys/resource.h>
using namespace std;
int main() {
struct rusage r_usage;
getrusage(RUSAGE_SELF, &r_usage);
cout << r_usage.ru_maxrss << "kb\n";
cout << "Allocating...\n";
int a = 100000; // have tried range of numbers
int* memleaktest = new int[a]; // class member
if(!memleaktest)
cout << "Allocation failed";
getrusage(RUSAGE_SELF, &r_usage);
cout << "after allocation " << r_usage.ru_maxrss << "kb\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
allocatoin (~15000kb) 后我得到完全相同的值。在 Ubuntu x86 上。