免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: teclimber
打印 上一主题 下一主题

提高c代码的执行效率的方法有哪些? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2012-04-25 18:08 |只看该作者
回复 20# OwnWaterloo


斗不仅要靠经验,更要靠运气和发挥。摆一擂台,单打独斗,岂不快哉

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
22 [报告]
发表于 2012-04-25 18:10 |只看该作者
不是瓶颈就别优化,代码直观最好。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
23 [报告]
发表于 2012-04-25 18:12 |只看该作者
回复 21# walleeee

要玩你自己玩……
我等第二境界的只够资格围观

论坛徽章:
0
24 [报告]
发表于 2012-04-25 18:13 |只看该作者
回复 23# OwnWaterloo


我上午一帖,阳春白雪,垃圾袋还没回我呢,我正说道兴头上,不知道咋搞的

论坛徽章:
0
25 [报告]
发表于 2012-04-25 18:14 |只看该作者

论坛徽章:
0
26 [报告]
发表于 2012-04-25 18:48 |只看该作者
1,效率低的代码
IDINT32U   Pulse1=0,Pulse2=0;
        
    if(g_stTPM[TpmNum].Capture[ChalNum].CapNum == 0
    ||g_stTPM[TpmNum].Capture[ChalNum].CapNum == g_stTPM[TpmNum].Capture[ChalNum].TargetCapNum-1
     || g_stTPM[TpmNum].Capture[ChalNum].CapNum == (g_stTPM[TpmNum].Capture[ChalNum].TargetCapNum-1)/2)
    {
        g_stTPM[TpmNum].Capture[ChalNum].ChannelVal[g_stTPM[TpmNum].Capture[ChalNum].SaveNum] = TPM_TPM1CxV(ChalNum);
        g_stTPM[TpmNum].Capture[ChalNum].Overflow[g_stTPM[TpmNum].Capture[ChalNum].SaveNum] = g_stTPM[TpmNum].Overflow;
        g_stTPM[TpmNum].Capture[ChalNum].SaveNum ++;
    }
    g_stTPM[TpmNum].Capture[ChalNum].CapNum++;
    g_stTPM[TpmNum].Capture[ChalNum].TotalCapNum++;
    if(g_stTPM[TpmNum].Capture[ChalNum].CapNum == g_stTPM[TpmNum].Capture[ChalNum].TargetCapNum)
    {
        g_stTPM[TpmNum].Capture[ChalNum].CapNum = 0;
        g_stTPM[TpmNum].Capture[ChalNum].SaveNum = 0;
        
        Pulse1 = (g_stTPM[TpmNum].Capture[ChalNum].Overflow[1]*65536 + g_stTPM[TpmNum].Capture[ChalNum].ChannelVal[1])
                      -(g_stTPM[TpmNum].Capture[ChalNum].Overflow[0]*65536  + g_stTPM[TpmNum].Capture[ChalNum].ChannelVal[0]);
        Pulse2 = (g_stTPM[TpmNum].Capture[ChalNum].Overflow[2]*65536 + g_stTPM[TpmNum].Capture[ChalNum].ChannelVal[2])
                      -(g_stTPM[TpmNum].Capture[ChalNum].Overflow[1]*65536  + g_stTPM[TpmNum].Capture[ChalNum].ChannelVal[1]);
        if((Pulse1  > Pulse2+DELTA) || (Pulse1< Pulse2-DELTA))
        {
            return;
        }
        
        g_stTPM[TpmNum].Capture[ChalNum].Freq =  BUS_CLOCK* (g_stTPM[TpmNum].Capture[ChalNum].TargetCapNum-1)/(Pulse1+Pulse2) ;// calculate the frequency
        if(g_stTPM[TpmNum].Capture[ChalNum].Freq > 1000
            &&  g_stTPM[TpmNum].Capture[ChalNum].TargetCapNum == CAP_LOW_FREQ_NUM)         
        {
            g_stTPM[TpmNum].Capture[ChalNum].TargetCapNum = CAP_HIGH_FREQ_NUM;
            return;
        }
        TPM_ChIntDis(TpmNum,ChalNum);// disable channel interrupt
    }

2,效率高一点的代码
IDINT32U   Pulse1=0,Pulse2=0;
     
    if(g_stCapture.CapNum == 0 ||g_stCapture.CapNum == g_stCapture.TargetCapNum-1 || g_stCapture.CapNum == (g_stCapture.TargetCapNum-1)/2)
    {
        g_stCapture.ChannelVal[g_stCapture.SaveNum] = TPM_TPM1CxV(CH0);
        g_stCapture.Overflow[g_stCapture.SaveNum++] = g_stTPMInfo.Overflow;
      
    }
    g_stCapture.CapNum++;
    g_stCapture.TotalCapNum++;
    if(g_stCapture.CapNum == g_stCapture.TargetCapNum)
    {
        g_stCapture.CapNum = 0;
        g_stCapture.SaveNum =0;
        
        Pulse1 = (g_stCapture.Overflow[1] -g_stCapture.Overflow[0])*65536
                    + g_stCapture.ChannelVal[1] - g_stCapture.ChannelVal[0];
        Pulse2 = (g_stCapture.Overflow[2] -g_stCapture.Overflow[1])*65536
                    + g_stCapture.ChannelVal[2] - g_stCapture.ChannelVal[1];
        if((Pulse1  > Pulse2+DELTA) || (Pulse1< Pulse2-DELTA))
        {
            return;
        }
        
        g_stCapture.Freq =  BUS_CLOCK* (g_stCapture.TargetCapNum-1)/(Pulse1+Pulse2) ;// calculate the frequency
        if(g_stCapture.Freq > 1000 && g_stCapture.TargetCapNum == CAP_HIGH_FREQ_NUM)         
        {
            g_stCapture.TargetCapNum = CAP_HIGH_FREQ_NUM;
            return;
        }
       TPM_ChIntDis(g_stTPMInfo.TpmNum,g_stTPMInfo.ChalNum);// disable channel interrupt
    }

论坛徽章:
0
27 [报告]
发表于 2012-04-25 18:50 |只看该作者
根据你的问题,我不知道该说些什么。建议你看看
http://bbs.chinaunix.net/thread-3727715-1-1.html

论坛徽章:
0
28 [报告]
发表于 2012-04-25 18:50 |只看该作者
两个结构基本没变,最大的变化就是变量的定义了。效率低的就是定义的结构体比较大,主要是为了扩展方便。请大家看看到底是什么原因?是寻址时消耗掉了时间吗?

论坛徽章:
3
巳蛇
日期:2013-10-03 10:41:48申猴
日期:2014-07-29 16:12:04天蝎座
日期:2014-08-21 09:24:52
29 [报告]
发表于 2012-04-25 19:08 |只看该作者
深入理解计算机操作系统有讲啊..
第5章,优化程序性能

局部变量,循环展开

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
30 [报告]
发表于 2012-04-26 00:36 |只看该作者
塑料袋 发表于 2012-04-25 17:35
1) 还正在入门C语言的是第一个境界
2) 像解毒专家,什么waterloo,什么幻圈上帝,那些纠结于语言的表达能力的,是第二个境界。
3) 不怎么关心语言,只关注于事物原本逻辑的,是第三个。
4) 不仅搞清楚了事物原本的逻辑,而且代码中还关注时间局部性,空间局部性这些计算机的本质特征,是第四个。

程序啥都没变,但是按照这两个局部性精心排列的程序,可能执行速度快N多倍。 ...


第 (4)也就是体系架构的内容罢了,有啥好吹的。把《Computer Architecture:A Quantitative Approach》(最新出到第五版了)看过之后,这些问题统统秒杀,也就是一个合格的研一学生应该达到的水平。

还是数学(算法)是王道,这才是没有止境的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP