0

在 Windows 中,pycurl 将计时精度精确到小数点后 3 位,有没有办法将其改进为更精确的东西?

> print c.getinfo(pycurl.CONNECT_TIME)
> 0.265

例如,Linux 将其精确到小数点后 7 位。

4

2 回答 2

2

查看 pycurl 的源代码,它只是调用底层 cURL 函数:

case CURLINFO_CONNECT_TIME: // other cases [snip]ped
        /* Return PyFloat as result */
        double d_res = 0.0;

        res = curl_easy_getinfo(self->handle, (CURLINFO)option, &d_res);
        if (res != CURLE_OK) {
            CURLERROR_RETVAL();
        }
        return PyFloat_FromDouble(d_res);
    }

反过来做

case CURLINFO_CONNECT_TIME:
    *param_doublep = data->progress.t_connect;
    break;

并由t_connect_

data->progress.t_connect = Curl_tvdiff_secs(now, data->progress.t_startsingle);

哪些引用t_startsingle,由 分配Curl_tvnow,在 Windows 下定义为

struct timeval curlx_tvnow(void)
{
  /*
  ** GetTickCount() is available on _all_ Windows versions from W95 up
  ** to nowadays. Returns milliseconds elapsed since last system boot,
  ** increases monotonically and wraps once 49.7 days have elapsed.
  */
  struct timeval now;
  DWORD milliseconds = GetTickCount();
  now.tv_sec = milliseconds / 1000;
  now.tv_usec = (milliseconds % 1000) * 1000;
  return now;
}

也就是毫秒精度。

如此短的修补和重新编译 cURL 以使用更高精度的计时器,然后针对它编译 pyCURL,不。对不起!

于 2012-11-16T13:10:45.197 回答
2

恐怕这是底层 libcurl 代码的限制。它使用 Windows 中的 GetTickCount() 函数调用,文档如下

GetTickCount 函数的分辨率受限于系统计时器的分辨率,通常在 10 毫秒到 16 毫秒的范围内。

于 2012-11-17T13:14:39.743 回答