如何在 C 中测量 DNS 查找时间
How to measure DNS lookup time in C
所以我想知道在 C 程序中查找 DNS 需要多长时间。
我正在使用函数 getaddrinfo() 进行 DNS 查找,所以我想我必须简单地测量此函数到 return 所花费的时间,以便获得 dns 查找时间。
然而,情况似乎并非如此。
我还有另一个 C 程序使用 libcurl 和两个程序测量 DNS 查找时间 return 同时查找同一个网络服务器时的不同时间。
getaddrinfo() 到 return 只需要 4-5 毫秒,而 libcurl 告诉我 DNS 查找平均需要 15 毫秒。我在 linux 和 Windows 上都进行了测试,结果相似。
令人困惑的是,当我在 Visual Studio 释放模式下启动程序时,getaddrinfo() returns 在 ~15ms 内,但是一旦我从以太 linux 或 [=28 的控制台启动它=] 它有 4-5 毫秒的时间。
此外,getaddrinfo 的 return 时间保持不变(在控制台执行时),即使我查找的服务器距离很远,而 libcurl 最多需要 60 毫秒。
除了 getaddrinfo() 之外,我想不出有什么可以衡量的,所以我的问题是如何在 C 中正确衡量 DNS 查找(没有外部库如 libcurl 的帮助)?
这里是我测量时间的代码片段供参考:
没有 libcurl:
...
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_NUMERICSERV;
if (prog->prog_ipver == 4)
hints.ai_family = AF_INET;
else if (prog->prog_ipver == 6)
hints.ai_family = AF_INET6;
struct timespec ts_dns_start, ts_dns_end, ts_dns_result;
timespec_get(&ts_dns_start, TIME_UTC);
e = getaddrinfo(host, port_str, &hints, &res);
timespec_get(&ts_dns_end, TIME_UTC);
timespec_diff(&ts_dns_start,&ts_dns_end, &ts_dns_result);
printf("%.3lf;", (ts_dns_result.tv_nsec/(double) 1000000));
...
使用 libcurl
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl;
CURLcode res;
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
curl_easy_setopt(curl, CURLOPT_PORT, port);
curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
res = curl_easy_perform(curl);
if(res == CURLE_OK)
{
double connect_dns;
res = curl_easy_getinfo(curl, CURLINFO_NAMELOOKUP_TIME, &connect_dns);
if(CURLE_OK == res)
{
printf("%.3lf" , connect_dns * 1000.0);
...
为了回答我自己的问题,问题是 libcurl 解决 URL 的标准方法是他们的线程解析器,其中前几次超时太慢了。
切换到非线程解析器模式解决了这个问题,开发人员还为他们的线程解析器修复了 github,请参阅:https://curl.haxx.se/mail/lib-2018-06/0117.html
所以我想知道在 C 程序中查找 DNS 需要多长时间。 我正在使用函数 getaddrinfo() 进行 DNS 查找,所以我想我必须简单地测量此函数到 return 所花费的时间,以便获得 dns 查找时间。 然而,情况似乎并非如此。 我还有另一个 C 程序使用 libcurl 和两个程序测量 DNS 查找时间 return 同时查找同一个网络服务器时的不同时间。
getaddrinfo() 到 return 只需要 4-5 毫秒,而 libcurl 告诉我 DNS 查找平均需要 15 毫秒。我在 linux 和 Windows 上都进行了测试,结果相似。 令人困惑的是,当我在 Visual Studio 释放模式下启动程序时,getaddrinfo() returns 在 ~15ms 内,但是一旦我从以太 linux 或 [=28 的控制台启动它=] 它有 4-5 毫秒的时间。
此外,getaddrinfo 的 return 时间保持不变(在控制台执行时),即使我查找的服务器距离很远,而 libcurl 最多需要 60 毫秒。
除了 getaddrinfo() 之外,我想不出有什么可以衡量的,所以我的问题是如何在 C 中正确衡量 DNS 查找(没有外部库如 libcurl 的帮助)?
这里是我测量时间的代码片段供参考:
没有 libcurl:
...
memset(&hints, 0, sizeof(hints));
hints.ai_flags = AI_NUMERICSERV;
if (prog->prog_ipver == 4)
hints.ai_family = AF_INET;
else if (prog->prog_ipver == 6)
hints.ai_family = AF_INET6;
struct timespec ts_dns_start, ts_dns_end, ts_dns_result;
timespec_get(&ts_dns_start, TIME_UTC);
e = getaddrinfo(host, port_str, &hints, &res);
timespec_get(&ts_dns_end, TIME_UTC);
timespec_diff(&ts_dns_start,&ts_dns_end, &ts_dns_result);
printf("%.3lf;", (ts_dns_result.tv_nsec/(double) 1000000));
...
使用 libcurl
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl;
CURLcode res;
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_DEFAULT_PROTOCOL, "https");
curl_easy_setopt(curl, CURLOPT_PORT, port);
curl_easy_setopt(curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
res = curl_easy_perform(curl);
if(res == CURLE_OK)
{
double connect_dns;
res = curl_easy_getinfo(curl, CURLINFO_NAMELOOKUP_TIME, &connect_dns);
if(CURLE_OK == res)
{
printf("%.3lf" , connect_dns * 1000.0);
...
为了回答我自己的问题,问题是 libcurl 解决 URL 的标准方法是他们的线程解析器,其中前几次超时太慢了。 切换到非线程解析器模式解决了这个问题,开发人员还为他们的线程解析器修复了 github,请参阅:https://curl.haxx.se/mail/lib-2018-06/0117.html