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
链接。
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.
我有一个调用 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
链接。
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.