免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6214 | 回复: 11
打印 上一主题 下一主题

工作这么多年,遇到的最诡异的问题: 调用空函数居然很耗时!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-06 17:15 |只看该作者 |倒序浏览
int main() /*在文件main.c中*/
{
  记录当前时间到buffer1;
  func_a(); /*调用func_a函数,后面打印的时间显示耗时3ms,而改为调用func_b函数,基本不耗时,在A.c中再写个类似的空函数func_aa(),此处改为调用func_aa函数,同样耗时3ms左右,在B.c中再写个类似的空函数func_bb(),此处改为调用func_bb函数,同样不耗时.确认记录时间的方法没有问题,也确定func_命名的函数被调用了(如果增加打印是可以打印出来的)*/
  记录当前时间到buffer2;
  打印buffer1;
  打印buffer2;
  return 0;
}

void func_a() /*在文件A.c中*/
{
  return;
}

void func_b() /*在文件B.c中*/
{
  return;
}

CPU是powerpc,由于实际上func_a()不会直接return,而是要干事情的,所以耗时就更多了,超过了3ms,这个时间无法接受,也不可能把A.c中的东西都挪到B.c中去,因为很大很大。哪位牛人能帮忙搞定这个问题呀?

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
2 [报告]
发表于 2010-10-06 20:17 |只看该作者
回复 1# eagerbever_m


    3ms这么长?调度一次在10ms吧
建议你A。B 2个程序在shell里穿插,重复乱着连执行。看符合上面的规律不?

论坛徽章:
0
3 [报告]
发表于 2010-10-06 23:22 |只看该作者
呵呵,这样的现象挺有意思。
要不单独做一个测试用例?

A.c B.c 的头文件是怎么样的?
链接命令又是怎么样的?

论坛徽章:
0
4 [报告]
发表于 2010-10-07 02:02 |只看该作者
反汇编看一下,感觉链接器做了手脚。。。

论坛徽章:
0
5 [报告]
发表于 2010-10-07 18:21 |只看该作者
空函数为啥还要调用它?

你说:“由于实际上func_a()不会直接return”, 那你那样测量出来的时间对么?

自己把逻辑理清楚先。

论坛徽章:
0
6 [报告]
发表于 2010-10-08 10:51 |只看该作者
你记录时间是怎么记录的?是记录的墙上时间还是user时间,如果是空函数,编译器估计直接优化掉了吧。。。现在编译器好聪明的。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
7 [报告]
发表于 2010-10-08 12:08 |只看该作者
方便的话,LZ把全部代码贴上来,也可以上有兴趣的朋友测试一下。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
8 [报告]
发表于 2010-10-08 12:34 |只看该作者
回复 1# eagerbever_m


    这个问题实在是诡异,求源码及编译后的汇编代码得真相

论坛徽章:
0
9 [报告]
发表于 2010-10-08 18:08 |只看该作者
to smalloc (留级生):  在shell下直接调用果然不耗时,目前的程序是在脚本自动启动的。这可能是条很重要的线索。

to linyunxian: 头文件没什么特别的地方,链接命令如下:
$(LMFILE) : $(LIBOBJS)
        @$(ECHO) "--- Building $@"
        $(VERB)$(RM) $@
        $(VERB)$(CXX) $(LDOUT) -static $(LIBOBJS) $(LDFLAGS) $(LMLIBS)

to new_learner:反汇编,没玩过,先研究下。

to accessory: func_a()不是空函数,它耗时很长,所以用二分法定位,结果发现即使在入口处直接return也耗时很长.

代码如下:
int main(int argc , char * argv[])
{
    char logbuf1[1*1024]={0};
    char logbuf2[1*1024]={0};
    memset(logbuf1,0,sizeof(logbuf1));
    memset(logbuf2,0,sizeof(logbuf2));
    Display_Now_Time_In_UserSpace(logbuf1);
    g_Message(); /*出问题的地方,耗时特长约3ms*/
    Display_Now_Time_In_UserSpace(logbuf2);
    printf("%s\n",logbuf1);
    printf("%s\n",logbuf2);
    sleep(5);
}

void Display_Now_Time_In_UserSpace(char* timeStr)
{
  struct timeval tv; struct tm* timeData; unsigned int seconds,micros,usecs; char buf[32];
  gettimeofday(&tv, (struct timezone*)0);
  seconds = ((unsigned long)tv.tv_sec) & 0xFFFFFFFFUL;
  micros = (((unsigned long)tv.tv_usec) & 0xFFFFFFFFUL)/1000;
  usecs = (((unsigned long)tv.tv_usec) & 0xFFFFFFFFUL)%1000;
  sprintf(timeStr, "%d.%03d.%03d", seconds,micros,usecs);
}

void g_Message()
{
  return;
}

输出的结果是:
9.299.659
9.302.145

论坛徽章:
0
10 [报告]
发表于 2010-10-09 15:47 |只看该作者
是比较奇怪。

在shell下直接调用果然不耗时,目前的程序是在脚本自动启动的。这可能是条很重要的线索。

脚本自动启动的?? 是说的 开机自动启动么?

我直接编译好了,放在脚本里面也是不耗时间的。

不知道楼主说的脚本自动启动 是什么一个情况,在描述详细一些
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP