У меня есть код, где я называю libcurl api. При выполнении нагрузочного тестирования производительность кода ухудшается. Я сделал чек, чтобы увидеть узкие места, и, по моему мнению, я получил странные результаты.Время, затраченное на функцию в C. Получение странных значений
Фактический вызов curl_easy_perform()
занимает несколько микросекунд, в то время как функция, которая вызывает это, сообщает время, затраченное на 5000 секунд (ранее оно показывало 10-20 секунд, что выглядело реалистично, но теперь не знаю, что произошло.).
Ниже приведены коды:
метод getresource (это вызывает Fn, которая вызывает локон API)
int getResource(const db_key_t * _k, const db_val_t * _v, const int _n, db_res_t ** _r, const char *_rt, char *_u1, char *_u2)
{
char *url = (char *) pkg_malloc(MAX_URL_LEN);
if (url == NULL)
{
LM_ERR("No more pkg memory left");
return -1;
}
if (create_url(_k, _v, _n, url, _rt, _u1, _u2) < 0)
{
LM_ERR("Failed to process request. URL creation failed.\n");
pkg_free(url);
return -1;
}
int status = 0;
struct json_response re;
struct json_response *jresponse = &re;
jresponse->payload = (char *) malloc(1);
if (!jresponse->payload)
return -1;
jresponse->size = 0;
/*t = clock();
status = curl_get(url, &jresponse);
t = clock() - t;
double time_taken = ((double) t)/CLOCKS_PER_SEC; // in seconds
*/
clock_t t1 = clock();
LM_WARN("Time value t1: %d",t1);
status = curl_get(url, &jresponse);
clock_t t2 = clock();
LM_WARN("Time value t2: %d",t2);
double time_taken = ((double)(t2-t1))/CLOCKS_PER_SEC; // in seconds
LM_WARN(" curl_get took %f seconds \n", time_taken);
int return_status = 0;
if (status == 200) // returned results
{
return_status = parse_json_to_result(jresponse->payload, _r);
}
else if (status != 404) // no results, return_status = 0
{
return_status = -1;
}
pkg_free(url);
if (jresponse->payload)
free(jresponse->payload);
LM_DBG("************parse_status: %d", return_status);
return return_status;
}
curl_get (это вызывает локон API)
int curl_get(const char* url, struct json_response **result) {
t = clock();
CURLcode res;
int http_code = 0;
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Accept: application/json");
headers = curl_slist_append(headers, "Content-Type: application/json");
headers = curl_slist_append(headers, "charsets: utf-8");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
if (result != NULL) {
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void **)result);
}
res = curl_easy_perform(curl);
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
curl_slist_free_all (headers);
curl_easy_reset (curl);
t = clock() - t;
double time_taken = ((double) t)/CLOCKS_PER_SEC; // in seconds
LM_WARN(" Main call took %f seconds \n", time_taken);
return http_code;
}
И ниже находится журнал:
curl_get: main call took 0.000220 seconds //calls the web url
getResource: curl_get took 5778 seconds //this called curl_get
pres_search_db: getResource took 15.482565 seconds // this calls getresource
Пожалуйста, помогите мне понять, что происходит.
EDIT Переменная т объявлена как глобальная в отдельных файлах C и все функции, упомянутые здесь, являются частью различных .c файлов.
Благодаря
Пожалуйста, исправьте грязный отступ, если вы ожидаете, что другие прочтут этот код. – Lundin