奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

C語言

C語言中循環結構優化入門級方法介紹

時間:2025-05-18 17:34:30 C語言 我要投稿
  • 相關推薦

C語言中循環結構優化入門級方法介紹

  循環結構是結構化程序設計中的三種基本結構之一,也是程序設計的基礎。文主要介紹了C語言中對于循環結構優化的一些入門級方法,包括算法設計的改進來提高一些并行性等方法,供參考學習,感興趣的小伙伴們可以參考一下!想了解更多相關信息請持續關注我們應屆畢業生考試網!

  一.代碼移動

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

  例子:

  優化前:

  void lower1(char *s){

  int i;

  for(i=0;i<strlen(s);++i)

  if(s[i]>='A'&&s[i]<='Z')

  s[i]-=('A'-'a');

  }

  優化后:

  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');

  }

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

  二.減少函數調用

  例子:

  優化前:

  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;

  }

  }

  優化后:

  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];

  }

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

  三.減少內存訪問

  例子:

  優化前:

  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];

  }

  優化后:

  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;

  }

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

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

  優化前:

 

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

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

  優化后:

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

  四.循環展開

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

  例子:

  優化前的代碼見前一篇博客里的sum3.

  優化后:

  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;

  }

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

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

  五.提高并行性

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

  2.1使用多個累積變量

  優化代碼示例

  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;

  }

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

  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;

  }

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


【C語言中循環結構優化入門級方法介紹】相關文章:

C語言循環結構11-04

關于c++語言中的循環語言08-16

C語言循環結構的嵌套06-18

C語言基礎循環結構07-28

C語言中while循環和do...while循環07-19

C語言中define的全部使用方法介紹10-15

C語言循環結構知識點07-16

Java 循環結構介紹08-13

C語言中define的使用方法10-07

主站蜘蛛池模板: 寻乌县| 安新县| 三穗县| 绥阳县| 巩义市| 柘荣县| 苗栗县| 芜湖市| 达孜县| 新龙县| 建昌县| 揭东县| 华坪县| 南江县| 洞口县| 丹江口市| 长白| 进贤县| 原阳县| 洛浦县| 政和县| 鹿邑县| 峡江县| 商水县| 临泽县| 河东区| 浙江省| 无为县| 始兴县| 田林县| 青海省| 裕民县| 山西省| 龙井市| 保靖县| 阿拉善右旗| 安泽县| 邯郸县| 鹤岗市| 望谟县| 镇平县|