当前位置: 首页 > 面试题库 >

C:Windows和其他操作系统中clock()的不同实现?

谢洛城
2023-03-14
问题内容

我必须为大学编写一个非常简单的控制台程序,该程序必须测量进行输入所需的时间。

因此,我clock()fgets()通话前后都使用了它。在我的Windows计算机上运行时,它运行完美。但是,当在我的朋友Mac-
Book和Linux-PC上运行时,它给出的结果非常小(仅几微秒的时间)。

我在所有3个操作系统上尝试了以下代码:

#include <stdio.h>
#include <time.h>
#include <unistd.h>

void main()
{
    clock_t t;

    printf("Sleeping for a bit\n");

    t = clock();

    // Alternatively some fgets(...)
    usleep(999999);

    t = clock() - t;

    printf("Processor time spent: %lf", ((double)t) / CLOCKS_PER_SEC);
}

在Windows上,输出显示1秒(或使用时键入所需的时间fgets),在其他两个OS上显示不超过0秒。

现在我的问题是,为什么clock()在这些OS上的实现会有如此不同。对于Windows,似乎线程在睡眠/等待时时钟一直在滴答,但是对于Linux和Mac不是吗?

编辑:到目前为止,谢谢您的回答,所以这实际上只是Microsoft的错误实现。

任何人都可以回答我的最后一个问题:

还有一种方法可以测量我想要在使用C标准库的所有3个系统上进行测量的方法,因为clock()这似乎只能在Windows上以这种方式工作?


问题答案:

如果我们看一下源代码,为clock()Mac
OS X上,我们可以看到它使用的实施getrusage,并读取ru_utime + ru_stime。这两个字段测量进程(或系统,代表进程)使用的CPU时间。这意味着,如果usleep(或fgets)导致OS交换不同的程序以执行,直到发生某种情况,那么经过的任何实时时间(也称为“挂历时间”,如“挂钟”中所述)都不会计入该值可以clock()在Mac
OS X上返回。您可能可以在Linux中进行挖掘并找到类似的东西。

但是,在Windows上,clock() 返回自该过程开始以来经过的墙时间。

在纯C语言中,我不知道OS
X,Linux和Windows上可用的函数将以亚秒级的精度返回时间(time.h相当有限)。你必须GetSystemTimeAsFileTime在Windows上,将返回你时间为100ns片,gettimeofday从BSD,将返回时间微秒精度。

如果您可以接受第二精度,则可以使用time(NULL)

如果选择C
++,则可以使用其中的一个时钟std::chrono来获得所需的精度。



 类似资料:
  • 更多面试题总结请看:【面试题】技术面试题汇总 互斥锁的实现 1. 禁止中断 进入临界区前禁止中断,离开之前恢复中断。这样任何中断都不会发生,包括时钟中断,也就是说 CPU 不会被切换到其他线程。 优点是实现简单。缺点有很多: 给用户禁止中断的权利很危险,如果用户进程死循环,操作系统可能永远无法获取控制权 只适用于单 CPU 的场景,其他 CPU 上运行的线程仍然可以访问临界资源,因为不同 CPU

  • 我已经在某些操作系统中测试了主动MQ JMS创建器。结果如下: > 这是正常的行为吗?因为在Linux,它要快得多?文档仅基于Linux。 而且,< code >慢速KahaDB访问是否会降低activeMQ的性能? 谢谢。

  • 操作系统提供的服务 操作系统的五大功能,分别为:作业管理、文件管理、存储管理、输入输出设备管理、进程及处理机管理 中断 所谓的中断就是在计算机执行程序的过程中,由于出现了某些特殊事情,使得CPU暂停对程序的执行,转而去执行处理这一事件的程序。等这些特殊事情处理完之后再回去执行之前的程序。中断一般分为三类: 内部异常中断:由计算机硬件异常或故障引起的中断; 软中断:由程序中执行了引起中断的指令而造成

  • 其他操作 执行 sudo mn -c 会进行清理配置操作,适合故障后恢复。 执行 exit 会退出 Mininet 的 CLI,同时给出运行时间统计。 py cmd 使用 Python 来执行 cmd。 测试 Mininet 启动后立刻关闭的时间可以用 sudo mn --test none。

  • sed sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。 sed命令行格式为: sed [-nefri] ‘command’ 输入文本 常用选项: -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的

  • 进程与线程 对于有线程系统: 进程是资源分配的独立单位 线程是资源调度的独立单位 对于无线程系统: 进程是资源调度、分配的独立单位 进程之间的通信方式以及优缺点 管道(PIPE) 有名管道:一种半双工的通信方式,它允许无亲缘关系进程间的通信 优点:可以实现任意关系的进程间的通信 缺点: 长期存于系统中,使用不当容易出错 缓冲区有限 无名管道:一种半双工的通信方式,只能在具有亲缘关系的进程间使用(父