C中的函数所花费的时间。获取奇怪的值

时间:2016-02-05 07:08:54

标签: c curl libcurl

我有一个代码,我调用libcurl api。进行负载测试时,代码的性能会恶化。我做了一些检查以查看瓶颈,根据我的理解,我得到了奇怪的结果。

curl_easy_perform()的实际调用需要几微秒,而调用它的函数报告时间为5000秒(早些时候它显示10-20秒看起来很现实,但现在不知道发生了什么。 )。

以下是代码:

getresource方法(这称为调用curl api的fn)

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(这称为curl 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

请帮助我了解最新情况。

修改 变量 t 在各个C文件中声明为全局,此处提到的所有函数都是不同.c文件的一部分。

由于

2 个答案:

答案 0 :(得分:3)

据我所知,t是一个全局变量。

然后你在curl_get函数中覆盖它的值。

当代码从curl_get返回时,t的值是curl_get执行的经过时间,这远离实际的clock()返回值。

修改

最后问题是t的声明。

在OP情况下,每个发布的函数都有一个不同的文件。 在每个文件中,OP声明了一个t变量。 这并不意味着每个变量范围对于它所属的文件是本地的。

从声明中省略static意味着隐式extern链接。

Nutshell

  

编译器在没有存储类说明符的情况下处理函数声明,就像它们包含说明符extern一样。类似地,您在所有函数外部声明但没有存储类说明符的任何对象标识符都具有外部链接。

答案 1 :(得分:1)

当您输入curl_get时,我认为您正在覆盖getResource中使用的测量变量t。当你执行clock() - t时,你没有得到适当的减法。

将您的个人计时器声明设置为本地,您不应该遇到这些干扰问题。另外,请正确格式化您的代码,以便更容易阅读。