音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

for () 優(yōu)化

作者:wangyibo 欄目:單片機(jī)
for () 優(yōu)化
請(qǐng)教各位
  如下程序怎么優(yōu)化啊,謝謝!


n=0x80;
for(i=0,k=7;i<8;i++,k--)
  {
    m=0x80;
    for(j=0;j<16;j++)
    {
     if(Res_cont[i][j] !=0)
      Res_cont[8][k] |=m;                      m >>=(j&0x01);
    }
    if((Res_cont[i][16] !=0)&&(Res_cont[i][16] !=0xff))
      Res_cont[8][8] |=n;
    n >>=1;

    BRIDGE[k]=Res_cont[8][k];
  }
BRIDGE[8]=Res_cont[8][8];

2樓: >>參與討論
wangyibo
換行錯(cuò)了
n=0x80;
            for(i=0,k=7;i<8;i++,k--)
                {
                    m=0x80;
                    for(j=0;j<16;j++)
                        {
                            if(Res_cont[i][j] !=0)
                                Res_cont[8][k] |=m;
                            m >>=(j&0x01);
                        }
                    if((Res_cont[i][16] !=0)&&(Res_cont[i][16] !=0xff))
                        Res_cont[8][8] |=n;
                    n >>=1;

                    BRIDGE[k]=Res_cont[8][k];
                }
                BRIDGE[8]=Res_cont[8][8];

3樓: >>參與討論
afanti
re
你的程序上的for語(yǔ)句用的不夠好,類似for(i=0;i<8;i++)可以這樣寫for(i=8;i!=0;i--),是因?yàn)榭梢允褂胐ecfsz指令,具體的結(jié)果你看看匯編代碼吧。

還有你使用2維數(shù)組,MCU計(jì)算偏移量時(shí)使用乘法計(jì)算,造成代碼較多。


4樓: >>參與討論
wangyibo
for(i=8;i!=0;i--), 不一定頂用
謝謝
  不過(guò),把for(i=0;i<8;i++)可以這樣寫for(i=8;i!=0;i--),我看了執(zhí)行的時(shí)間上一樣的,沒有改觀的, 
 。2維數(shù)組,MCU計(jì)算偏移量時(shí)使用乘法計(jì)算",應(yīng)該不是吧,不知道還有誰(shuí)知道不知道,不過(guò)就算用乘法,它內(nèi)部也有硬件乘法器啊,一個(gè)乘法也需要一個(gè)指令周期。
 

5樓: >>參與討論
gfs0521
改成for(i=8;--i;) 代碼和時(shí)間會(huì)減小
 
6樓: >>參與討論
afanti
re
你是優(yōu)化代碼還是優(yōu)化執(zhí)行時(shí)間?
修改for語(yǔ)句確實(shí)能減少代碼和執(zhí)行時(shí)間,但是和循環(huán)內(nèi)的語(yǔ)句比不能體現(xiàn)優(yōu)勢(shì)。建議樓主多看看C編譯后的代碼,多了解匯編。
要想優(yōu)化執(zhí)行的時(shí)間,恐怕有點(diǎn)難,你的循環(huán)太長(zhǎng)了,需要自己想了,你的C代碼倒是不多,但是MCU執(zhí)行起來(lái)就多了

* - 本貼最后修改時(shí)間:2006-1-11 16:47:19 修改者:afanti

7樓: >>參與討論
wangyibo
確實(shí)我想優(yōu)化執(zhí)行的時(shí)間
以上各位的方法我都試過(guò),變化不大--在時(shí)間上.至于代碼的長(zhǎng)短沒關(guān)系,
主要要求時(shí)間短

8樓: >>參與討論
su_mj000
How about this way?
    CHAR *bp = &BRIDGE[7];
    CHAR *rp = &Res_cont[8][7];
    
    n = 0x80;
    for (i = 0; i < 8; i++)
    {
        CHAR tmp;
        
        m = 0x80;
        for (j = 0; j < 16; j++)
        {
            if ( Res_cont[i][j] != 0 )
                *rp |= m;
            
            if ( (j & 0x01) )
                m >>= 1;
        }
        
        tmp = Res_cont[i][16];
        
        if ( (tmp != 0) && (tmp != 0xff) )
            Res_cont[8][8] |= n;

        n >>= 1;

        *bp-- = *rp--;
    }

    BRIDGE[8] = Res_cont[8][8];


9樓: >>參與討論
wangyibo
有改善哦 su_mj000
su_mj000 的改成指針的方式還真的有改善啊,時(shí)間上小了200US啊,謝謝了,不過(guò)為什么指針就時(shí)間小了,

不知道還有沒有更小的時(shí)間方式

10樓: >>參與討論
wangyibo
中間變量 tmp
中間變量 tmp 來(lái)替換Res_cont[i][16];應(yīng)該沒什么改善吧


11樓: >>參與討論
su_mj000
偏移是變量
數(shù)組(尤其是多維數(shù)組)的偏移是變量值時(shí)將牽涉到較多的
運(yùn)算(甚至乘法),所以得盡量減少它們地出現(xiàn).而指針的
遞增/遞減運(yùn)算卻快得多.

不知樓主用的是何種編譯.若編譯的優(yōu)化度較低時(shí),此處的
tmp就會(huì)起做用(因?yàn)镽es_cont[i][16]出現(xiàn)兩次).語(yǔ)句
的優(yōu)化只是雕蟲小技,重要的是對(duì)算法進(jìn)行優(yōu)化.

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
CCS C編譯器vs PICC 指針不能指向常數(shù)數(shù)組原因初探
TLC5617兩個(gè)輸出端不能同時(shí)更新
關(guān)于PIC的復(fù)位端的處理
菜鳥問(wèn)題~~pic 匯編指令~
請(qǐng)教關(guān)于異步通信的問(wèn)題
免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)