Итак, я хочу узнать, сколько времени занимает поиск DNS в программе на Си.Я использую функцию getaddrinfo () для поиска DNS, поэтому я решил просто измерить время, которое требуется этой функции для возврата, чтобы получить время поиска DNS.Однако, похоже, это не так.У меня также есть другая программа на C, которая измеряет время поиска DNS с помощью libcurl, и обе программы возвращают разное время при поиске на одном и том же веб-сервере одновременно.
getaddrinfo () для возврата требуется только 4-5 мс, тогда как libcurlговорит мне, что поиск DNS занял в среднем 15 мс.Я проверял это как на Linux, так и на Windows, и результаты были похожими.Что-то сбивает с толку, что getaddrinfo () возвращается через ~ 15 мсек, когда я запускаю программу в режиме выпуска Visual Studio, но как только я запускаю ее из консоли в ether linux или windows, она имеет эти 4-5 мсек раз.
Кроме того, время возврата getaddrinfo остается тем же (при выполнении консоли), даже если я ищу сервер, который находится далеко, в то время как libcurl идет до 60 мс.
Я не могу придумать ничего, что можно измерить, кроме getaddrinfo ()поэтому мой вопрос заключается в том, как правильно измерить поиск DNS в C (без помощи внешних библиотек, таких как 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);
...