| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 617 人关注过本帖, 1 人收藏
标题:怎么优化这个程序?
只看楼主 加入收藏
xieshenghui
Rank: 2
等 级:论坛游民
帖 子:44
专家分:15
注 册:2011-12-24
结帖率:85.71%
收藏(1)
已结贴  问题点数:10 回复次数:13 
怎么优化这个程序?
#include <stdio.h>
int main (void)
{
    int a=10000,b,c,d,e,f,g;
    b=a/5+a;
    c=(a+b)/5+b;
    d=(a+b+c)/5+c;
    e=(a+b+c+d)/5+d;
    f=(a+b+c+d+e)/5+e;
            printf("%d,%d,%d,%d,%d,%d,%d\n",a,b,c,d,e,f,g=(a+b+c+d+e+f)*3.3);
        return 0;
}
这个代码还可以怎么样优化啊?我是新手不懂啊?
如果这个程序一直写到g,h,i,j,k,l,这样一直写下去怎么优化?
搜索更多相关主题的帖子: 优化 怎么样 include return 
2012-04-14 19:22
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:5 
就这个程序本身来说 优化的意义不大

不知道你想实现什么功能呢 呵呵
2012-04-14 19:26
xieshenghui
Rank: 2
等 级:论坛游民
帖 子:44
专家分:15
注 册:2011-12-24
收藏
得分:0 
只是想学习下,功能的话这个是用来自己算东西的。请问下还能怎么优化啊?
2012-04-14 19:32
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
编译器开优化的情况下会在程序编译的时候把这几个数算出来 所以你会看到优化过的程序直接把这几个数打出来 这是最优化的方法

因为这里程序在运行前就已经知道这几个数的值了 所以可以用上面的优化方法

如果要通用性 考虑以下方法

1 用移位操作代替除以2的整数次幂的运算 比如除以2 4 8 16等等 当然这里不能用。。

2 如果是除数的范围已知的考虑用乘法代替除法 具体百度一下你就知道

3 算法优化
2012-04-14 19:36
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用zklhp在2012-4-14 19:36:38的发言:

编译器开优化的情况下会在程序编译的时候把这几个数算出来 所以你会看到优化过的程序直接把这几个数打出来 这是最优化的方法

因为这里程序在运行前就已经知道这几个数的值了 所以可以用上面的优化方法

如果要通用性 考虑以下方法

1 用移位操作代替除以2的整数次幂的运算 比如除以2 4 8 16等等 当然这里不能用。。

2 如果是除数的范围已知的考虑用乘法代替除法 具体百度一下你就知道

3 算法优化

上面说的开优化的情况是一种理想的状况 不过一般的编译器都能做这样的优化了 如果不能你找他们。。

考虑你狠可能不会去百度我给你帖一段罢

除数是常量的除法可以用乘以倒数来做。 为了计算无符号整型除法q=x/d,可以先计算除数的倒数f=2^r/d,这里的r定义了二进制小数点的位置(基点)。 然后把x与f相乘再右移r位即可。 r的最大值是32+b,b是d的有效二进制位的位数-1(即b是满足2^b<=d的最大整数)。 用了r=32+b就可以覆盖被除数x的最大范围。

为了弥补舍入造成的误差,上面的算法还需要做一些细分的操作。 因此下面的方法用了取整操作,得到了无符号整数除法的正确结果,它的结果与DIV指令给出的结果是一致的(感谢 Terje Mathisen 发明了这个方法):

    b = (d的有效位位数) - 1
    r = 32 + b
    f = 2^r / d
    如果f是一个整数,那么可以判断d是2的幂次:case A。
    如果f不是整数,那么看f的小数部分是否 < 0.5 :f的小数部分 < 0.5,case B;f的小数部分> 0.5 ,case C。

    case A: (d = 2^b)
    结果 = x SHR b

    case B: (f的小数部分 < 0.5)
    把f向下取整,然后
    结果 = ((x+1) * f) SHR r

    case C: (f的小数部分 > 0.5)
    把f向上取整,然后
    结果 = (x * f) SHR r

示例:
假定除数是5,
5 = 00000101b。
b = (有效位位数) - 1 = 2
r = 32+2 = 34
f = 2^34 / 5 = 3435973836.8 = 0CCCCCCCC.CCC... (十六进制)
f的小数部分大于0。5,进入case C,f向上取整得到0CCCCCCCDh。

类似的例子还有很多

上面漏了一个 还有一种优化方法是改成浮点运算 但会带来其他问题 不推荐

这里主要优化的是除法 因为除法的用时大约比是加 减或乘大一个数量级 不过在这里可以说没有区别 差的那几十个时钟周期应该是纳秒级罢 你能感觉出来么
2012-04-14 19:44
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
还有 刚才是你要的VS罢 不给分不是好同学哦。。。
2012-04-14 19:46
xieshenghui
Rank: 2
等 级:论坛游民
帖 子:44
专家分:15
注 册:2011-12-24
收藏
得分:0 
额,,看不懂你发的方法。我主要是优化变量,因为变量太多了。如果还要下下去的话,变量会很麻烦的。
2012-04-14 19:50
xieshenghui
Rank: 2
等 级:论坛游民
帖 子:44
专家分:15
注 册:2011-12-24
收藏
得分:0 
回复 5楼 zklhp
是啊,昨天老杨用了我的编译器,
char都不能识别的。VS2010太大了。
2012-04-14 19:51
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
竟然是这个优化 改循环?
2012-04-14 19:57
xieshenghui
Rank: 2
等 级:论坛游民
帖 子:44
专家分:15
注 册:2011-12-24
收藏
得分:0 
回复 9楼 zklhp
我不懂啊?我现在只能写成这个代码。那个VS的分没有哦。你看我的分都没有了,以后补上哈。
怎么用循环写啊?
2012-04-14 20:03
快速回复:怎么优化这个程序?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028913 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved