2016-02-05 2 views
-1

У меня есть код, где я называю 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 файлов.

Благодаря

+0

Пожалуйста, исправьте грязный отступ, если вы ожидаете, что другие прочтут этот код. – Lundin

ответ

3

Насколько я могу видеть, t является глобальной переменной.

Затем вы переписываете его значение в функцию curl_get.

Когда код возврата из curl_get значение t является истекшее время curl_get исполнения, что далеко от фактического значения clock() возврата.

EDIT

В конце проблема была декларация t.

В случае OP для каждой опубликованной функции был другой файл. В каждом файле OP объявлена ​​переменная t. Это не означает, что каждая область переменной локальна для файла, к которому он принадлежит.

Опущение static из декларации означает неявное extern соединение.

Nutshell

Компилятор обрабатывает объявления функций без класса хранения спецификатора, как если бы они входили спецификатор EXTERN. Аналогично, любые идентификаторы объектов, которые вы объявляете вне всех функций и без спецификатора класса хранения, имеют внешнюю связь.

+0

Все три функции являются частью различных файлов .c. – user3275095

+0

@ user3275095 Вопрос в том, где и как объявляется 't'? Я подозреваю, что 't' объявлен в один файл c и' extern' на остальных. – LPs

+0

Нет, его объявлено как глобальная переменная в отдельном файле C. – user3275095

1

Я думаю, что вы переписав переменную т измерения, используемой в getResource при вводе curl_get. Тогда вы не получите правильного вычитания, когда вы выполняете clock() - t.

Сделайте свои индивидуальные объявления таймера локальными, и у вас не должно быть этих проблем с помехами. Также, пожалуйста, правильно отформатируйте свой код, чтобы его было легче читать.

+0

Все три функции являются частью различных файлов .c и жаль насчет форматирования, исправит. – user3275095

Смежные вопросы