perf_counter源码
时间: 2023-10-30 16:06:47 浏览: 106
由于perf_counter是Python中的一个内置函数,其源码实际上是由C语言实现的。以下是perf_counter在C语言中的实现:
```c
static PyObject *
time_perf_counter(PyObject *module)
{
PyObject *res;
PyTime_t now = _PyTime_GetPerfCounter();
if (now == -1)
return NULL;
res = PyFloat_FromDouble((double)now);
if (res == NULL)
return NULL;
return res;
}
```
该函数首先调用了一个名为\_PyTime\_GetPerfCounter()的函数,该函数返回当前的性能计数器值(即计算机时钟的高精度计数器值)。然后将该值转换为一个Python浮点数对象,并返回给调用者。
在Windows平台上,\_PyTime\_GetPerfCounter()的实现如下:
```c
PyTime_t
_PyTime_GetPerfCounter(void)
{
LARGE_INTEGER count;
if (!QueryPerformanceCounter(&count))
return -1;
return (PyTime_t)count.QuadPart;
}
```
该函数调用了Windows API函数QueryPerformanceCounter()获取当前的性能计数器值,并返回该值。在Unix/Linux平台上,\_PyTime\_GetPerfCounter()的实现如下:
```c
PyTime_t
_PyTime_GetPerfCounter(void)
{
struct timespec ts;
if (clock_gettime(CLOCK_MONOTONIC_RAW, &ts) != 0)
return -1;
return ((PyTime_t)ts.tv_sec * PyTime_SHIFT) + ts.tv_nsec / PyTime_NSPERUS;
}
```
该函数调用了Unix/Linux系统库函数clock_gettime()获取当前的系统时钟值,并返回该值。需要注意的是,在Unix/Linux平台上,性能计数器值实际上是由系统时钟的值和纳秒级别的计数器值组成的,因此在返回性能计数器值时需要进行一些计算和调整。
总之,perf_counter的源码实际上是由C语言实现的,其主要实现思路是通过调用操作系统提供的性能计数器或系统时钟函数来获取当前时间或计数器值,并将其转换为Python浮点数对象返回给调用者。
阅读全文