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

Time taken by function in C. Getting strange values

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

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

代码如下:

getresource方法(调用curl的fnapi)

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 文件的一部分。

谢谢

我认为您在输入 curl_get 时覆盖了 getResource 中使用的测量变量 t。当你做 clock() - t.

时,你就得不到正确的减法

将您的个人计时器声明放在本地,这样您就不会遇到这些干扰问题。另外请正确格式化您的代码,以便于阅读。

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

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

curl_get的代码return时,t的值是curl_get执行的经过时间,与实际clock()相差甚远return 值。

编辑

最后的问题是 t 的声明。

在 OP 案例中,每个发布的函数都有一个不同的文件。 在每个文件中,OP 都声明了一个 t 变量。 这并不意味着每个变量作用域对于它所属的文件都是局部的。

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

Nutshell

The compiler treats function declarations without a storage class specifier as if they included the specifier extern. Similarly, any object identifiers that you declare outside all functions and without a storage class specifier have external linkage.