亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C語言中對于循環(huán)結構優(yōu)化的一些入門級方法簡介

2020-05-23 14:12:16
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C語言中對于循環(huán)結構優(yōu)化的一些入門級方法,包括算法設計的改進來提高一些并行性等方法,要的朋友可以參考下
 

一.代碼移動

將在循環(huán)里面多次計算,但是結果不會改變的計算,移到循環(huán)外面去。

例子:

優(yōu)化前:

void lower1(char *s){int i;for(i=0;i<strlen(s);++i)   if(s[i]>='A'&&s[i]<='Z')    s[i]-=('A'-'a');}優(yōu)化后:void lower2(char *s){int i;int len=strlen(s);for(int i=0;i<len;++i)  if(s[i]>='A'&&s[i]<='Z')    s[i]-=('A'-'a');}

優(yōu)化前的版本,由于每次循環(huán)都要調用strlen計算s的長度,實際上的復雜度成了O(n2)了,而優(yōu)化后的版本只需計算一次s的長度,因此性能上比優(yōu)化前版本要好。

二.減少函數調用

例子:

優(yōu)化前:

void sum1(vec_ptr v,data_t *dest){int i;int len=vec_length(v);*dest=0;for(i=0;i<len;++i){  data_t val;  get_vec_element(v,i,&val);  *dest+=val;}}

優(yōu)化后:

data_t get_vec_start(vec_ptr v){return v->data;}void sum2(vec_ptr v,data_t *dest){int i;int len=vec_length(v);data_t *data=get_vec_start(v);*dest=0;for(i=0;i<len;++i)  *dest+=data[i];}

優(yōu)化前的版本在每次循環(huán)中都要調用一次get_vec_element獲得相應的項,而優(yōu)化后的版本只需在循環(huán)外調用一次get_vec_start獲得開始的內存地址,循環(huán)內直接訪問內存,無需調用函數。

三.減少內存訪問

例子:

優(yōu)化前:

void sum2(vec_ptr v,data_t *dest){int i;int len=vec_length(v);data_t *data=get_vec_start(v);*dest=0;for(i=0;i<len;++i)  *dest+=data[i];}

優(yōu)化后:

void sum3(vec_ptr v,data_t *dest){int i;int len=vec_length(v);data_t *data=get_vec_start(v);data_t acc=0;for(i=0;i<len;++i)  acc+=data[i];*dest=acc;}

優(yōu)化前的版本每次迭代都要從dest讀出值再加上data[i],再將結果寫回dest。這樣的讀寫很浪費,因此每次迭代開始從dest讀出的值就是上次迭代寫回dest的指。優(yōu)化后的版本通過加入acc臨時變量,它循環(huán)中累積計算出的結果,循環(huán)結束后再寫回。

這里給出兩個版本相應的匯編結果就可以很清楚看出區(qū)別:

優(yōu)化前:

C語言中對于循環(huán)結構優(yōu)化的一些入門級方法簡介

優(yōu)化前的版本每次迭代都要從dest讀出值再加上data[i],再將結果寫回dest。這樣的讀寫很浪費,因此每次迭代開始從dest讀出的值就是上次迭代寫回dest的指。優(yōu)化后的版本通過加入acc臨時變量,它循環(huán)中累積計算出的結果,循環(huán)結束后再寫回。

第二行和第四行分別對dest進行了讀寫。

優(yōu)化后:

C語言中對于循環(huán)結構優(yōu)化的一些入門級方法簡介

從匯編結果可以看出編譯器將acc直接放在了寄存器里,循環(huán)中無需對內存進行讀寫。

四.循環(huán)展開

循環(huán)展開可以減少循環(huán)的次數,對程序的性能帶了兩方面的提高。一是減少了對循環(huán)沒有直接貢獻的計算,比如循環(huán)計數變量的計算,分支跳轉指令的執(zhí)行等。二是提供了進一步利用機器特性進行的優(yōu)化的機會。

例子:

優(yōu)化前的代碼見前一篇博客里的sum3.

優(yōu)化后:

void sum4(vec_ptr v,data_t *dest){int i;int len=vec_length(v);int limit=len-3;data_t *data=get_vec_start(v);data_t acc=0;for(i=0;i<limit;i+=4){  acc=acc+data[i]+data[i+1];  acc=acc+data[i+2]+data[i+3];}for(;i<len;++i)  acc+=data[i];*dest=acc;}

通過循環(huán)展開,每次迭代將累加4個元素,減少了循環(huán)次數,從而減少了總的執(zhí)行時間(單獨使用這種優(yōu)化方法,對浮點數累乘幾乎沒有提高,但是整數累乘得益于編譯器的重關聯代碼變化會有大幅度提高)。

這種優(yōu)化可以直接利用編譯器完成,將優(yōu)化level設定到較高,編譯器會自動進行循環(huán)展開。使用gcc,可以顯式使用-funroll-loops選項。

五.提高并行性

現代處理器大多采用了流水線、超標量等技術,可以實現指令級并行。我們可以利用這個特性對代碼做進一步的優(yōu)化。

2.1使用多個累積變量

優(yōu)化代碼示例

void sum5(vec_ptr v,data_t *dest){int i;int len=vec_length(v);int limit=len-1;data_t *data=get_vec_start(v);data_t acc0=0;data_t acc1=0;for(i=0;i<limit;i+=2){  acc0+=data[i];  acc1+=data[i+1];}for(;i<len;++i)  acc0+=data[i];*dest=acc0+acc1;}

這里同時使用了循環(huán)展開和使用多個累加變量,一方面減少了循環(huán)次數,另一方面指令級并行的特性使得每次迭代的兩次加法可以并行執(zhí)行?;谶@兩點可以顯著減少程序執(zhí)行的時間。通過增加展開的次數和累加變量的個數,可以進一步提高程序的性能,直到機器指令執(zhí)行的吞吐量的極限。

2.2重結合變換

除了使用多個累積變量顯式利用機器的指令級并行特性外,還可以對運算重新結合變換,打破順序相關性來享受指令級并行帶來的好處。

在sum4中,acc=acc+data[i]+data[i+1]的結合順序是acc=(acc+data[i])+data[i+1];

我們將之變成acc=acc+(data[i]+data[i+1]);

代碼如下:

void sum6(vec_ptr v,data_t *dest){int i;int len=vec_length(v);int limit=len-3;data_t *data=get_vec_start(v);data_t acc=0;for(i=0;i<limit;i+=4){  acc=acc+(data[i]+data[i+1]);  acc=acc+(data[i+2]+data[i+3]);}for(;i<len;++i)  acc+=data[i];*dest=acc;}

進一步增加循環(huán)展開的次數,可以進一步提高程序性能,最終也可以達到機器指令執(zhí)行的吞吐量的極限。(在循環(huán)展示提到的整數乘法的性能提高就在于編譯器隱式采取了這種變換,但是由于浮點數不具備結合性,所以編譯器沒有采用,但是程序員在保證程序結果正確性的情況下,可以顯式使用這一點)。



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产精品网站在线播放| 成人在线高清免费| 欧美精品卡一卡二| 宅男在线观看免费高清网站| 开心久久婷婷综合中文字幕| 视频在线不卡免费观看| 青青草一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 欧美巨胸大乳hitomi| 日韩一区二区精品| 亚洲免费观看高清完整版在线观看| 国产日韩欧美一区二区三区视频| 最近在线中文字幕| 国产中文字幕在线观看| 日韩在线观看你懂的| 精品成人国产| 五月婷婷久久丁香| 成年人羞羞的网站| 二区三区四区高清视频在线观看| 性高潮免费视频| 欧美图片自拍偷拍| 好吊日在线视频| 精品剧情在线观看| 久久精品一区二区三区av| 亚洲欧美综合区自拍另类| 成人18视频在线观看| 8888四色奇米在线观看| 国产午夜精品一区二区理论影院| 天天夜碰日日摸日日澡| 久久久精品中文字幕麻豆发布| 国产精品一级片在线观看| 亚洲精品在线网站| 欧美高清另类hdvideosexjaⅴ| 久久成人综合视频| 亚洲尤物在线视频观看| 国产一区二区三区毛片| 亚洲天堂电影| 99re6在线视频| 自拍欧美日韩| 美女胸又www又黄的网站| 精品国产av 无码一区二区三区| 欧美美女黄色| 亚洲最大色图| 成人免费视频观看| 在线观看视频网站你懂得| 国产精品视频免费一区二区三区| 中文字幕第一页在线播放| 国产精品入口久久| 澳门成人av网| 亚洲自拍偷拍一区| 麻豆精品视频入口| 视频精品一区二区| 午夜精品久久久久久久久久| 欧美区在线播放| 精品影院一区| 日韩欧美在线免费| 亚洲三级色网| 男的操女的网站| 蜜桃视频一日韩欧美专区| 播九公社成人综合网站| 亚洲综合五月天| 91黄视频在线| 中文字幕电影av| 一级做a爰片久久毛片美女图片| 一本大道东京热无码aⅴ| 中文在线а√在线| 国产aⅴ激情无码久久久无码| 欧美在线一区二区三区四| www.五月婷| 日韩在线 中文字幕| 无码人妻aⅴ一区二区三区有奶水| 99精品视频免费观看视频| 国产91免费视频| 久久三级福利| 性生活一级大片| www.麻豆| 欧美成人精品激情在线视频| 国产精品亲子伦对白| www.天天射.com| 亚洲成在人线免费观看| 7777在线视频| 在线免费观看高清视频| 色香蕉久久蜜桃| 欧美综合天天夜夜久久| 日韩一级毛片| 国产亚洲精品久久飘花| 日本一区二区在线免费观看| 午夜激情视频在线播放| 99久久99久久久精品棕色圆| 无人日本免费视频| www.色综合.com| 一级免费黄色录像| 欧美一区一区| 久久久亚洲国产美女国产盗摄| 羞羞视频在线观看| 欧美色另类天堂2015| 日本高清中文字幕| 欧美日韩亚洲综合在线| 亚洲无吗一区二区三区| 午夜在线一区| 亚洲一区二区三区综合| 国产又猛又黄的视频| 国产在线精品自拍| 成人免费看黄网址| 欧美日韩精品欧美日韩精品| 亚洲黄色免费| 国产午夜精品美女毛片视频| 成人动漫视频在线观看免费| 香蕉影视欧美成人| 色七七影院综合| 91嫩草在线播放| 欧美日韩破处视频| 亚洲电影免费| 久久精品一区中文字幕| 喷白浆一区二区| 秋霞在线视频| 国产毛片久久久久久久| 亚洲欧洲av| 99蜜月精品久久91| 福利视频大全| 成人在线观看a| 日韩成人网免费视频| 任你操精品视频| 亚洲天堂777| 欧美日韩不卡合集视频| 顶级网黄在线播放| 成人福利一区| 久草视频在线资源站| 久久久久久女乱国产| 国产男男gay网站| 亚洲一区在线观看免费| av五月天在线| 国产一卡二卡三卡四卡| 国产999精品久久久久久绿帽| 成人免费在线电影网| 日本成人免费视频| 日韩中文一区二区三区| 日韩精品中文字幕有码专区| 美女被艹视频网站| 成人一级福利| 亚洲成av人片在线观看| 麻豆一区二区麻豆免费观看| 久久综合久久久久88| 福利所第一导航| 日韩精品免费一区二区三区竹菊| 一区二区免费电影| 一级毛片久久久| 色综合久久中文| 欧美a一区二区| 伊人久久影院| 荫蒂被男人添免费视频| 激情综合在线| 91精品国产色综合久久不卡粉嫩| 国产精品久久久久久久小唯西川| 最近中文字幕2019免费| 日日夜夜天天操| 51精品秘密在线观看| 精品国产福利| 一区二区三区不卡视频在线观看| 久久精品人人爽| 看欧美ab黄色大片视频免费| 任你操这里只有精品| 亚洲va欧美va国产综合剧情| 嫩草香蕉在线91一二三区| 午夜精品福利视频| 日韩最新免费不卡| 狠狠网亚洲精品| 欧美专区亚洲专区| 国产福利一区二区三区| 9色视频在线观看| 欧美一区,二区| 国产欧美高清视频在线| 日韩在线不卡一区| 中文字幕在线视频网| 一区二区三区在线视频看| 91官网在线观看| 夜色福利刺激| 456国产精品| 91麻豆免费观看| 国产91足控脚交在线观看| 第四色中文综合网| 操你啦视频在线| av免费在线电影| 日韩一区二区欧美| 偷拍精品一区二区三区| 亚洲人成电影院在线观看| 超碰成人在线观看| 日本一区二区免费高清视频| 可以看美女隐私的网站| 亚洲毛片av在线| 在线成人国产| 夜色77av精品影院| 中文av字幕在线观看| 少女频道在线观看免费播放电视剧| 亚洲成色777777女色窝| 国产精品亚洲午夜一区二区三区| 久久久久国产精品夜夜夜夜夜| 久久精品欧美日韩| 国产精品无遮挡| 韩国无码一区二区三区精品| 懂色av色香蕉一区二区蜜桃| 一区二区高清不卡| 日韩黄色小视频| 一本久道综合久久精品| 亚洲爆乳无码精品aaa片蜜桃| 亚洲视频欧美在线| 欧美精品尤物在线观看| 91精品免费久久久久久久久| 国产精品情侣呻吟对白视频| 老司机免费视频久久| 1pondo在线播放免费| 国产男女爽爽爽| 樱花www成人免费视频| 国产网站一区二区三区| 91国偷自产一区二区三区的观看方式| 色综合天天综合色综合av| 欧美与亚洲与日本直播| 天天天天天天操| 精品视频一二区| 在线午夜视频| www久久99| 乱子伦在线视频| 欧美日产一区二区三区在线观看| 欧美综合在线视频观看| 99久久久无码国产精品性波多| 麻豆传媒在线视频| 国产激情视频在线观看| 国产乱码精品一区二区三区中文| 久久频这里精品99香蕉| koreanbj精品视频一区| 日韩无码精品一区二区三区| 亚洲男人的天堂一区二区| 欧美精品videosbestsex另类| 无码精品黑人一区二区三区| 精品久久久久香蕉网| 91精品xxx在线观看| 国产激情一区二区三区在线观看| 一级特黄曰皮片视频| 91看片在线播放| 欧美日韩一区二区三区在线播放| 影音先锋一区二区资源站| 欧美一区二区三区在线视频| 亚洲男人的天堂在线aⅴ视频| 亚洲av激情无码专区在线播放| 青青在线视频观看| 国产日产精品_国产精品毛片| 中文字幕手机在线观看| 亚洲人妖av一区二区| 欧美一级在线免费观看| 国产淫片av片久久久久久| 国产欧美日韩精品综合| 丝袜美腿中文字幕| 久久久久亚洲AV成人网人人小说| 日本久久亚洲电影| 精品视频第一页| 国产喷水在线观看| 亚洲乱码国产乱码精品精可以看| 西西裸体人体做爰大胆久久久| 在线观看免费成人| 国内视频精品| 午夜视频久久久久久| 日韩中文字幕视频在线| 日韩成人黄色av| 成人欧美一区二区三区黑人孕妇| 日韩在线观看一区二区三区| 国产一区二区久久久久| 久久精品一区二区三区四区| 亚洲成av人在线观看| 2019中文字幕在线| 小明成人免费视频一区| 男女污污的视频| 波多野结衣亚洲| ady日本映画久久精品一区二区| 久久国产精品99久久人人澡| 菠萝蜜一区二区| 免费在线黄色网址| 99热国产免费| 国产91精品一区二区绿帽| 国产99在线 | 亚洲| 日本在线观看不卡视频| 日本精品另类| 麻豆国产精品va在线观看不卡| 一区二区在线免费观看视频| 在线观看国产一区二区三区| 国产伦精品一区二区三区在线播放| 午夜国产一区二区| 蜜桃视频成人m3u8| 国产高清在线观看视频| 鬼打鬼之黄金道士1992林正英| 欧美日韩大片一区二区三区| 久久久人成影片一区二区三区观看| 国产精品77777| 五月天久久综合网| 国产免费视频传媒| www.成年人视频| 九九精品视频在线看| jizz在线免费观看| 97国产精品| 欧美男男video| 同房视频网站| 视频一区二区三区在线| 亚洲影院天堂中文av色| 欧美三级免费观看| 国产91精品一区| 豆花视频一区| 99精品欧美一区二区三区| 福利视频久久| 91黄色免费视频| 国产91对白在线播放| julia一区二区三区中文字幕| а√在线中文网新版地址在线| 亚洲高清123| 成人高潮成人免费观看| 中文字幕一区二区三区四区免费看| 日本一区二区三区电影| 日韩精品水蜜桃| 欧美日韩国产精品成人| 国产精品久久国产精品99gif| 日本特黄久久久高潮| 欧美精品久久久久久久久| 国产在线播放一区三区四| 国模视频一区| 日本午夜在线| 色狠狠一区二区三区| 中文字幕在线看视频国产欧美| videoxxxx另类日本极品| 国产一区二区在线视频播放| 一区二区三区国产好的精华液|