- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 usage 测量各种函数调用的资源使用时间(用户和系统)。我发现我得到的结果大约为 10 毫秒,例如 0 秒、70000 秒、10000 秒等。如果有办法为 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.0s结束于:0.2000000s
我添加了另一个 for 循环并得到如下结果:开始时间:0.0s结束于:0.7000000s我浏览了很多,以找到一种可能的方法来获得准确的时间。在 linux 源等中遇到了 3 个参数 getrusage,但我不确定如何使用它,因为它需要任务指针作为第一个参数。其中一个链接表明它与 linux 版本有关。无论如何,如果有任何方法可以设置精度/粒度,请告诉我。如果没有,请让我知道是否有其他方法可以替代 getrusage。 gettimeofDay 似乎没有提供资源使用细节,因此如果我无法设置精度,请寻找 getrusage 的实际实现。
最佳答案
许多操作系统不会对进程使用的时间进行精确计算。在许多情况下,在每次上下文切换和系统调用时读取时钟的成本太高,在其他情况下,硬件甚至可能没有允许您精确计时的时钟。
您从 getrusage
获得的一种非常常用的计费方法是使用 100Hz(最常见的是 100Hz,尽管 64Hz 和 1024Hz 也很常见)定时器中断对系统上发生的事情进行采样在中断的时候。因此,内核每秒检查 100 次当前正在运行的内容和位置(ru_utime 的用户空间或 ru_stime 的内核空间)并递增计数器。然后该计数器被解释为您的程序运行了 10 毫秒。
您可以在您的系统上试验 clock_gettime
,看看它是否有每个进程的计数器,有时这些计数器比 getrusage
计数器更精确。但我不会抱太大希望,如果 10 毫秒分辨率是最好的 getrusage
可以做到的,那么 clock_gettime
可能不会有更好的分辨率或任何 -完全处理时钟。
如果操作系统中的时钟不足以进行测量,您唯一的选择是重复测试运行几分钟,然后将获得的结果除以运行次数。
gettimeofday
更精确这一事实并没有多大意义。 gettimeofday
可能相对昂贵。想一想内核为准确跟踪进程的用户和系统时间而必须做的工作。每次进行系统调用时,它都必须使用两次时间戳(一次用于系统调用的开始,一次用于结束),以跟踪您使用了多少系统时间。为了跟踪用户时间,每次系统切换到另一个进程时都需要时间戳。许多系统确实跟踪第二个,但不是第一个,因为系统调用比进程上下文切换更常见(这就是为什么我建议检查 clock_gettime
因为它可以有一个计时器来累积整个系统和进程的用户时间)。
现代系统中的时钟非常烦人,因为即使获取时间戳是最常见的系统调用之一,我们仍然经常需要拖网慢速总线并进行大量锁定才能获得它们。已经使用了其他解决方案,例如 cpu 上的循环计数器,但这些解决方案是出了名的不准确,因为它们可能在 CPU 之间不同步,可能具有可变频率,可以在操作系统的控制之外停止等,您需要知道您的 CPU 的确切型号,以便能够可靠地使用它们。操作系统有很多启发式方法来确定使用哪个时钟,但这可能意味着两台几乎相同的机器之间存在巨大差异。一个人可能会得到一个具有亚纳秒精度的周期计数器,这需要一条指令来读取,而另一条则需要通过 ISA 总线传输到具有微秒精度或更差的 30 年历史的芯片设计,这需要数千个周期才能读取。
关于c - getrusage 返回四舍五入的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19043873/
我有这个“科学应用程序”,其中 Single 值在显示在 UI 中之前应该四舍五入。根据this MSDN article ,由于“精度损失”,Math.Round(Double, Int32) 方法
这个问题类似于Chrome 37 calc rounding 但实际问题有点复杂,提供的解决方案不适用于这种情况: #outerDiv, #leftDiv, #middleDiv, #rightDiv
假设有一堆从 pnorm() 返回的数据,这样您就有了 .0003ish 和 .9999ish 之间的数字。 numbers <- round(rnorm(n = 10000, mean =
我想有效地将unsigneda整数除以2的任意幂,然后取整。所以我在数学上想要的是ceiling(p/q)0。在C语言中,不利用q受限域的Strawman实现可能类似于以下function1: /
我正在尝试获取 #value_box 的值以显示 100.5 但它一直在向上舍入。有谁知道我可以做些什么来让它显示小数位? jsfiddle //returns 101 $("#value_box
我有一段 JavaScript 代码 shipingcostnumber * parseInt(tax) / 100 + shipingcostnumber 返回数字为6655.866558,因此我将
我有一个关于 PostgreSQL 9.2 中 float 的新手问题。 是否有直接舍入 float 的函数,即不必先将数字转换为数字类型? 另外,我想知道是否有一个函数可以按任意度量单位舍入,例如最
这个问题已经有答案了: Rounding to nearest 100 (7 个回答) 已关闭10 年前。 我正在尝试将数字四舍五入到 100。 示例: 1340 should become 1400
我试图找出使用整数存储在列表中的其他两个数字之间的任何n在整数列表中找到最接近的值ROUNDED DOWN的最佳方法。在这种情况下,所有整数都将始终是无符号的,以防万一。 假设如下: 列表始终从0开始
我想将一个 BigDecimal 四舍五入到小数点后两位,但是当使用 round 方法时,它似乎没有双舍入: BigDecimal.new('43382.0249').round(2).to_s('F
我正在使用格式如下的财务数据进行计算: . 基本上,在我的程序中我遇到了一个浮点错误。例如,如果我有: 11.09 - (11.09 * 0.005) = 11.03455 我希望能够使用 11.03
有整型变量,电压单位为毫伏。 signed int voltage_mv = 134; //134mV 我有 2 段显示,我想显示百分之一伏特。 如何在一次操作中将毫伏转换为百分之一伏?没有 IF 语
这是我将数字四舍五入到两位小数的函数,但是当四舍五入的数字为 1.50 时,它似乎忽略尾随零并只返回 1.5 public static double roundOff(double number)
您好,我在将数字四舍五入到 -0 而不是 0 时遇到了问题 代码: 输出:-0 预期输出:0 我一直在寻找任何解决方案,但没有找到。 请解释并帮助我为什么它四舍五入为 -0 而不是 0?谢谢 最佳答
我正在使用 Java 的 Random 生成随机数:1.0、1.1 - 10 Random random = new Random(); return (double) ((random.nextIn
基本上,我有一个数字: 我基本上想做一些数学运算来创建这个数字 80。 如果数字是 62.7777777778,则数字将为 60。 我希望数字像这样四舍五入: 20, 40, 60, 80, 100
我希望显示来自 NSDate 对象的月数。 //Make Date Six Months In The Future NSCalendar *calendar = [[NSCalendar alloc
下面是一些小代码来说明我所看到的 float floater = 59.999f; DecimalFormat df = new DecimalFormat("00.0"); System.out.p
我现在开始使用 android 和 java,但遇到了问题。 I have a result x = 206.0548. And y = 206, both of type double How do
我有一个 ruby 散列数组,其中包含两个键,'tier' 和 'price'。对于给定的价格,我想退回等级。 这对于精确匹配来说已经足够简单了,但是我如何通过将我的输入值四舍五入到数组中的下一个
我是一名优秀的程序员,十分优秀!