ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c-getrusage返回四舍五入的数字

2019-11-22 19:51:36  阅读:127  来源: 互联网

标签:c-3 linux


我正在尝试使用rusage测量各种函数调用的资源使用时间(用户和系统).
我发现我得到的结果大约是10毫秒,例如0s 70000us,10000us等.请让我知道是否有一种方法可以设置getrusage的精度/粒度.

我的程序很简单:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>

int main(){
  struct rusage usage;
  struct timeval start, end;
  int i, j, k = 0;

  getrusage(RUSAGE_SELF, &usage);
  start = usage.ru_utime;
  printf("buffer check\n");
  char *str = "---";
  int arr[100],ctr;

  for(ctr = 0;ctr<100;ctr++){

    arr[ctr] = ctr + 1000;

  }

  for (i = 0; i < 10000; i++) {
     for (j = 0; j < 10000; j++) {
      k += 20;
  }
 }

 getrusage(RUSAGE_SELF, &usage);
 end = usage.ru_utime;

 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 1;
}

结果
开始时间:0.0秒
结束于:0.2000000s

我添加了另一个for循环,结果如下:
开始时间:0.0秒
结束于:0.7000000s
我进行了很多次浏览,以找到获取准确时间的可能方法.在Linux源代码等中遇到了3个参数getrusage,但是我不确定如何使用它,因为它需要任务指针作为第一个参数.链接之一表明它与linux版本有关.无论如何,请让我知道是否有任何方法可以设置精度/粒度.如果没有,请告诉我是否有替代方法. gettimeofDay似乎没有提供资源使用的详细信息,因此如果我无法设置精度,则寻找getrusage的实际实现.

解决方法:

许多操作系统没有对进程使用的时间进行精确的计算.在许多情况下,读取每个上下文切换和系统调用上的时钟太昂贵了,在其他情况下,硬件甚至可能没有一个时钟,可以让您以任何精度计时.

从getrusage获得的一种非常常用的计费方法是设置一个100Hz(通常为100Hz,尽管64Hz和1024Hz也很常见)计时器中断,以对中断时系统上发生的事情进行采样.因此,内核每秒检查100次,然后检查当前正在运行的内容和运行位置(用户空间ru_utime或内核空间ru_stime)并增加一个计数器.然后将该计数器解释为您的程序运行10ms.

您可以在系统上使用clock_gettime进行试验,看看它是否具有逐进程计数器,有时这些计数器可能比getrusage计数器更精确.但是我没有希望,如果10ms分辨率是最好的getrusage可以做到的,那么clock_gettime可能没有更好的分辨率,或者根本没有任何每个进程的时钟.

如果操作系统中的时钟不足以进行测量,则唯一的选择是将测试运行重复几分钟,然后将得到的任何结果除以运行次数.

gettimeofday更精确的事实并不意味着什么. gettimeofday可能相对昂贵.考虑一下内核为准确跟踪进程的用户和系统时间而必须做的工作.每次您进行系统调用时,都必须花费两次时间戳(一次用于开始系统调用,一次在结束时),以跟踪您使用了多少系统时间.为了跟踪用户时间,您需要在系统每次切换到另一个进程时使用时间戳记.许多系统的确会跟踪第二个,而不是第一个,因为系统调用比进程上下文切换要普遍得多(这就是我建议检查clock_gettime的原因,因为它可以有一个计时器,该计时器可以为一个进程累积系统和用户的总时间) .

现代系统中的时钟非常烦人,因为即使使用时间戳记是最常见的系统调用之一,我们仍然经常需要拖慢速度的总线并进行重锁来获取它们.已经使用了其他解决方案,例如cpu上的周期计数器,但是众所周知,这些解决方案不准确,因为它们可能在CPU之间不同步,频率可能可变,可能会在操作系统的控制范围之外停止等,并且您需要知道确切型号的CPU才能可靠地使用它们.操作系统有很多启发式方法可以找出要使用的时钟,但这可能意味着两台几乎相同的机器之间存在巨大差异.一个人可能会得到一个亚纳秒精度的周期计数器,该计数器要花费一条指令才能读取,而另一条计数器则需要通过ISA总线进入30年前的芯片设计,精度为微秒或更差,这需要数千个周期才能读取.

标签:c-3,linux
来源: https://codeday.me/bug/20191122/2061872.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有