C和C++中的Microtime()等效函数是什么?

8

我在想是否有一个与PHP函数microtime()等效的CC++函数。我搜索了一下,但没有找到明确的答案。

谢谢!

6个回答

9

虽然没有与PHP的microtime()完全等价的函数,但是您可以根据以下代码创建一个具有类似功能的函数:

Mac OS X和可能也适用于Linux/Unix

#include <sys/time.h>
struct timeval time;
gettimeofday(&time, NULL); #This actually returns a struct that has microsecond precision.
long microsec = ((unsigned long long)time.tv_sec * 1000000) + time.tv_usec;

(基于:http://brian.pontarelli.com/2009/01/05/getting-the-current-system-time-in-milliseconds-with-c/)


Windows:


unsigned __int64 freq;
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
double timerFrequency = (1.0/freq);

unsigned __int64 startTime;
QueryPerformanceCounter((LARGE_INTEGER *)&startTime);

//do something...

unsigned __int64 endTime;
QueryPerformanceCounter((LARGE_INTEGER *)&endTime);
double timeDifferenceInMilliseconds = ((endTime-startTime) * timerFrequency);

(answer by Darcara, 来自:https://dev59.com/Z1PTa4cB1Zd3GeqPfgZv#4568649)

1
它是 struct timeval time; - worenga
1
注意事项(适用于Windows用户):您必须包含profileapi.h文件(#include <profileapi.h>)。 - MAChitgarha
实际上我不同意,因为从C++11开始就有了与PHP的microtime()完全相等的函数 - 不过,你的回答可能是在C中获取它的方法 :) - hanshenrik
请问有人能解释一下第一个例子最后一行的强制类型转换吗?我知道它将 time.tv_sec 强制转换为 unsigned long long,这将成为乘法和加法的结果类型,并且被分配到左侧的 long 中(也进行了强制类型转换)。这里的想法是什么? - Michael Härtl

6
在Linux上,您可以使用gettimeofday,它应该提供相同的信息。实际上,我认为这就是PHP在底层使用的函数。

1
而在C++11中,您可以使用std::chrono::system_clock::now().time_since_epoch() - hanshenrik

4

我认为在C++11中,相当于PHP的microtime(true)的是:

#include <chrono>
double microtime(){
    return (double(std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count()) / double(1000000));
}
  • 但我不确定 C 语言的等效函数是什么,或者是否存在这样的函数(正如其他人指出的,gettimeofday 是 POSIX 的一部分,但不是 C/C++ 规范的一部分)

有趣的是,微秒是一秒的百万分之一,但 C++ 也支持纳秒,即一秒的十亿分之一,我想你如果使用 std::chrono::nanoseconds 而不是 std::chrono::microseconds,你会获得更高的精度,但此时你可能会遇到双精度浮点数的最大数字限制,并且函数名称会误导你(这样的函数应该命名为nanotime()而不是 microtime(),返回值应该比 double 更大),顺便说一下,我在这里收集了一些 PHP 函数移植到 C++ 中的代码:https://github.com/divinity76/phpcpp(其中包括 microtime() 函数)。


4

C++11添加了一些标准时间记录函数(见第20.11节“时间工具”),精度较高,但大多数编译器尚未支持。

主要需要使用操作系统API,例如POSIX的gettimeofday


3

如果需要计时代码段,可以尝试使用std::clock函数,它会返回时钟周期数,然后再除以CLOCKS_PER_SEC


我猜这取决于平台:不一定是在Windows上,但其他实现应该符合XSI标准(CLOCKS_PER_SEC == 1000000)。 - orip
1
它也不是实时的,而是CPU时间。 - R.. GitHub STOP HELPING ICE
它也不是一个绝对时间戳(日历),而只是经过的时间。 - Ben Voigt

1

libUTP(uTorrent传输协议库)在不同平台上获取微秒级时间的方法有一个很好的示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接