我想用C来测量时间,我很难弄明白,我想要的是这样的东西:

  • 启动计时器
  • 运行一个方法
  • 停止计时
  • 报告所用时间(至少达到微精度)

任何帮助都将不胜感激.

(我正在windows中使用mingw进行编译)

推荐答案

提供1微秒分辨率的高分辨率计时器是特定于系统的,因此您必须在不同的操作系统平台上使用不同的方法来实现这一点.您可能感兴趣的是判断下面的文章,它基于以下函数实现跨平台C++计时器类:

  • [宋浩安-高分辨率定时器][1]

Windows

Windows API提供了极高分辨率的计时器函数:QueryPerformanceCounter(),返回当前经过的滴答声;QueryPerformanceFrequency(),返回每秒滴答声的数量.

例子:

#include <stdio.h>
#include <windows.h>                // for Windows APIs

int main(void)
{
    LARGE_INTEGER frequency;        // ticks per second
    LARGE_INTEGER t1, t2;           // ticks
    double elapsedTime;

    // get ticks per second
    QueryPerformanceFrequency(&frequency);

    // start timer
    QueryPerformanceCounter(&t1);

    // do something
    // ...

    // stop timer
    QueryPerformanceCounter(&t2);

    // compute and print the elapsed time in millisec
    elapsedTime = (t2.QuadPart - t1.QuadPart) * 1000.0 / frequency.QuadPart;
    printf("%f ms.\n", elapsedTime);
}

Linux, Unix, and Mac

对于基于Unix或Linux的系统,您可以使用gettimeofday().此函数在"sys/time.h"中声明.

例子:

#include <stdio.h>
#include <sys/time.h>                // for gettimeofday()

int main(void)
{
    struct timeval t1, t2;
    double elapsedTime;

    // start timer
    gettimeofday(&t1, NULL);

    // do something
    // ...

    // stop timer
    gettimeofday(&t2, NULL);

    // compute and print the elapsed time in millisec
    elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0;      // sec to ms
    elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0;   // us to ms
    printf("%f ms.\n", elapsedTime);
}

C++相关问答推荐

我的C语言中的回归函数如何工作?

传递给空闲的无效地址0x71 db7 cb5e0:未分配值

Zig将std.os.argv转换为C类型argv

变量>;-1如何在C中准确求值?

如果包含路径不存在,我的编译器可以被配置为出错吗?(GCC、MSVC)

C lang:当我try 将3个或更多元素写入数组时,出现总线错误

Clang警告称,`ffi_type`与`sizeof`不兼容

C-使用指针返回修改后的整数数组

整型文字后缀在左移中的用途

SSH会话出现意外状态

在另一个函数中使用realloc和指针指向指针

如何将另一个数组添加到集合中,特别是字符串?

MacOS下C++的无阻塞键盘阅读

链接到底是如何工作的,我在这里到底做错了什么

使用%f格式说明符打印整数值

判断系统命令返回值的正确方法

链接器脚本和C程序使用相同的头文件,这可能吗?

在C中使用字符串时是否不需要内存分配?

将数组中的所有元素初始化为 struct 中的相同值

多行表达式:C 编译器如何处理换行符?