錢能C程序設計教程課件_第1頁
錢能C程序設計教程課件_第2頁
錢能C程序設計教程課件_第3頁
錢能C程序設計教程課件_第4頁
錢能C程序設計教程課件_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、10/28/2021錢能C程序設計教程1C+程序設計教程(第二版)Chapter 6 Performance 10/28/2021錢能C程序設計教程2n提高性能的意義: 性能對提高編程能力舉足輕重n如何提高性能? 以合理使用資源為前提,盡快完成任務的能力稱為效率效率影響性能,提高效率就能提高性能n學習目標: 1. 擴展視野,對同一問題的不同要求,模仿各種編程技巧與空間布局策略,予以應對從而對各種不同的問題,亦能應變自如 2. 掌握測試性能的方法,學會測算時/空交換的代價,客觀評估自身的編程能力10/28/2021錢能C程序設計教程3第六章內(nèi)容n 內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù) ( Inline Functi

2、ons ) n 數(shù)據(jù)結構數(shù)據(jù)結構 ( Data Structures ) n 算法算法 ( Algorithms ) n 數(shù)值計算數(shù)值計算 ( Numerical Computation )n STL算法算法 ( STL Algorithms ) n 動態(tài)內(nèi)存動態(tài)內(nèi)存 ( Dynamic Memory ) n 低級編程低級編程 ( Lower Programming ) 10/28/2021錢能C程序設計教程41. 內(nèi)聯(lián)函數(shù)內(nèi)聯(lián)函數(shù) ( Inline Functions )n做法:將一些反復被執(zhí)行的簡單語句序列做成小函數(shù)n用法:在函數(shù)聲明前加上inline關鍵字n作用:不損害可讀性又能提高性能

3、10/28/2021錢能C程序設計教程5n/=n#includenboolbool isDigit(charchar); / 小函數(shù)nintint main( )n forfor(charchar c; cinc & c!=n; )n ifif(isDigit(c) n std:cout“Digit.n;n elseelse std:cout=0 & ch=9 ? 1 : 0;n/=頻繁調(diào)用的函數(shù):用昂貴的開銷換取可讀性10/28/2021錢能C程序設計教程6n/=n#includenintint main( )n forfor(charchar c; cinc & c

4、!=n; )n ifif(ch=0 & ch=9 ? 1 : 0)n std:cout“Digit.n;n elseelse n std:cout“NonDigit.n;n/=內(nèi)嵌代碼:開銷雖少,但可讀性差10/28/2021錢能C程序設計教程7內(nèi)聯(lián)方式:開銷少,可讀性也佳n/=n#includeninline inline boolbool isDigit(charchar); / 小函數(shù)nintint main( )n forfor(charchar c; cinc & c!=n; )n ifif(isDigit(c) n std:coutDigit.n;n elseels

5、e n std:cout=0 & ch=9 ? 1 : 0;n/=內(nèi)聯(lián)標記放在函數(shù)聲明的前面10/28/2021錢能C程序設計教程8內(nèi)聯(lián)函數(shù)的使用經(jīng)驗:n函數(shù)體適當小,且無循環(huán)或開關語句,這樣就使嵌入工作容易進行,不會破壞原調(diào)用主體如:排序函數(shù)不能內(nèi)聯(lián)n程序中特別是在循環(huán)中反復執(zhí)行該函數(shù),這樣就使嵌入的代碼利用率較高如:上例中的isDigit函數(shù)n程序并不多處出現(xiàn)該函數(shù)調(diào)用,這樣就使嵌入工作量相對較少,代碼量也不會劇增 10/28/2021錢能C程序設計教程9n/=n#includen#includenusing namespaceusing namespace std;n/-nint

6、int calc1(intint a, intint b) returnreturn a+b; ninline intinline int calc2(intint a, intint b) returnreturn a+b; n/-nintint main()n intint x1000, y1000, z1000;n clock_t t = clock();n forfor(intint i=0; i1000*1000*1000; +i)n zi = calc1(xi%1000, yi%1000);n cout(clock()-t)/CLK_TCK“without inlinen;n t

7、= clock();n forfor(intint i=0; i1000*1000*1000; +i)n zi = calc2(xi%1000, yi%1000);n cout(clock()-t)/CLK_TCKf0605 8.281 without inline2.437 with inline10/28/2021錢能C程序設計教程112. 數(shù)據(jù)結構數(shù)據(jù)結構 ( Data Structures )n揭示:將數(shù)據(jù)結構實現(xiàn)為數(shù)據(jù)類型是編程的高級境界,STL容器就是系統(tǒng)提供的現(xiàn)成數(shù)據(jù)結構n做法:充分和合理使用STL容器,簡化復雜問題,提高編程效率與程序性能10/28/2021錢能C程序設計教程1

8、2問題:有許多序列,每個序列都等待驗證是否可從順序數(shù)列經(jīng)過棧操作而得 例如:順序數(shù)列 1,2,3,4,5 待驗證序列 3,2,1,5,4 待驗證序列 5,3,4,2,110/28/2021錢能C程序設計教程13采用不同的數(shù)據(jù)結構#include#include#include/ 棧方式: #include/ 向量方式:#includeusing namespace std;10/28/2021錢能C程序設計教程14棧方式/=intint main() ifstream in(rail.txt); forfor(intint n,line=0; inn & n & in.igno

9、re(); ) cout(line+ ? n:); forfor(string s; getline(in, s) & s!=0; ) istringstream sin(s); stack st; forfor(intint last=0,coach; sincoach; st.pop() forfor(intint p=last+1; p=coach; +p) st.push(p); if if(lastcoach) last=coach; if if(st.top()!=coach) break; coutn & n & in.ignore(); ) cout(l

10、ine+ ? n:); forfor(string s; getline(in, s) & s!=0; ) istringstream sin(s); vector st; forfor(intint last=0,coach; sincoach; st.pop_back() forfor(intint p=last+1; p=coach; +p) st.push_back(p); if if(lastcoach) last=coach; if if(st.back()!=coach) break; cout(!sin ? Yesn : Non); /=模仿棧操作10/28/2021錢

11、能C程序設計教程16結論n不同的數(shù)據(jù)結構有不同的操作和性能n應學習使用不同數(shù)據(jù)結構的經(jīng)驗10/28/2021錢能C程序設計教程173. 算法算法 ( Algorithms )n揭示:確定了數(shù)據(jù)結構之后,所采用的算法將直接決定程序的性能;任何語言都有個性,算法的選擇使用是靈巧運用語言的藝術,充分發(fā)揮語言的優(yōu)勢是活用算法的根本n做法:培養(yǎng)經(jīng)驗,用測試的辦法對算法進行選擇10/28/2021錢能C程序設計教程18問題:已知不太大的正整數(shù)n(n46),求Fibonacci數(shù)列 0 1 1 2 3 5 8 13 21 34 的第n項的值對于后面的四種算法: unsigned fibo1 (unsigne

12、d n); unsigned fibo2 (unsigned n); unsigned fibo3 (unsigned n); unsigned fibo4 (unsigned n);如何選擇其中之一 第0項第1項第2項10/28/2021錢能C程序設計教程19算法:遞歸法 優(yōu)點:算法簡單,容易編程 缺點:棧空間負擔過重,調(diào)用開銷過大nunsigned fibo1 (unsigned n)nn if (n=1) return n;n return fibo1(n-1) + fibo1(n-2);nn=0或110/28/2021錢能C程序設計教程20算法:迭代法 優(yōu)點:節(jié)省空間,節(jié)省時間缺點:編

13、程相對復雜nunsigned fibo2 (unsigned n)nn int c=n;n for (int a=0,b=1,i=2; i=n; +i)n c=a+b, a=b, b=c;n return c;n10/28/2021錢能C程序設計教程21算法3:向量迭代法 優(yōu)點:節(jié)省時間 缺點:n越大,占用堆空間越多nunsigned fibo3 (unsigned n)nn vector v(n+1, 0); n v1 = 1;n for (unsigned i=2; i=n; +i)n vi = vi-1 + vi-2;n return vn;n10/28/2021錢能C程序設計教程22算

14、法4:直接計算法 優(yōu)點:節(jié)省時間 缺點:引入了浮點計算nunsigned fibo4 (unsigned n)nn return n ( pow ( (1+ sqrt ( 5.0 ) ) / 2, n)n pow ( (1 sqrt ( 5.0 ) ) / 2, n) )n / sqrt ( 5.0 ) ;n10/28/2021錢能C程序設計教程23nfibo1:只在示意性編程中使用,但并不是否定一切遞歸法nfibo2:在講究性能的場合中使用,它省空間省時間,但在n很大的場合中,性能比不上fibo4nfibo3:可以數(shù)組代替向量,提高低級編程的性能,它易編易用,還可以讀取中間項的值,但在一味追

15、求性能的場合中,比不上fibo2nfibo4:在n不太大時,與fibo2相當,在n趨向很大時,其性能優(yōu)勢便充分體現(xiàn)10/28/2021錢能C程序設計教程244. 數(shù)值計算數(shù)值計算 ( Numerical Computation )n揭示:在近似計算中,除了計算范圍與終止計算條件外,還涉及逼近的快慢,這與算法有很大關系,選擇成熟的算法具有決定性作用n做法:了解各種數(shù)值計算算法的特點及使用場合,有的放矢解決實際問題10/28/2021錢能C程序設計教程25數(shù)值計算的參數(shù)描述template / T為賴以計算的數(shù)系 T method ( / method為某種算法T a, / 左邊界T b, / 右

16、邊界 const T Epsilon, / 終止條件 T ( * f ) ( T ) / 求值數(shù)學函數(shù));10/28/2021錢能C程序設計教程26矩形法double rectangle(double a, double b, const double Eps, double (*f ) (double) ) double w=b-a, sN = w*( f (a) + f (b) ) / 2, sO=0; for ( int n=1; abs ( sN - sO ) = Eps; n*=2 ) sO = sN; sN = 0; for ( int i=0; i Eps; n+=n, h/=2

17、.0 ) In=I2n; Tn=T2n; / In老積分值 double sigma=0; for ( int k=0; kn; k+ ) sigma += f ( a+(k+0.5)*h ); T2n=(Tn+h*sigma)/2; I2n=(4*T2n-Tn)/3; / I2n新積分值 return I2n;小矩形求和辛普生處理前后兩次辛普生值的差10/28/2021錢能C程序設計教程28性能比較求同樣的數(shù)學函數(shù),區(qū)間和精度矩陣法比辛普生法多循環(huán)許多次10/28/2021錢能C程序設計教程295. 標準標準+ 算法算法 ( Standard C+ Algorithms )n揭示:標準C+提

18、供了諸多算法,這些算法的組合構成了許多問題的解,對算法的準確了解是編程能力的一大體現(xiàn)n做法:吃透標準+算法,靈活運用之10/28/2021錢能C程序設計教程30容器的區(qū)間表示vector a (10);/ 下面表示待處理的元素vector b (a.begin ()+1, a.begin ()+7 ); 0123456789首尾待處理的元素10/28/2021錢能C程序設計教程31逐一讀入兩個字串,比較是否含有相同元素int main ( ) ifstream in ( string.txt ) ; for (string s,t; inst; ) 比較 輸出 yes 或 no 10/28/2

19、021錢能C程序設計教程32分別排序,直接加以字串比較是直截了當?shù)乃悸罚篺or ( string s,t; inst; ) sort ( s.begin ( ), s.end ( ) ) ; sort ( t.begin ( ), t.end ( ) ) ; coutst; ) int s1=count(s.begin(), s.end(), 1); int s0=count(s.begin(), s.end(), 0); int t1=count(t.begin(), t.end(), 1); int t0=count(t.begin(), t.end(), 0); coutst; ) in

20、t s1=count ( s.begin(), s.end(), 1) ; int t1=count ( t.begin(), t.end(), 1) ; cout (s1=t1 & s.length()=t.length() ? yesn : non);C+標準算法10/28/2021錢能C程序設計教程356. 動態(tài)內(nèi)存動態(tài)內(nèi)存 ( Dynamic Memory )n揭示:許多問題不知道數(shù)據(jù)量的大小,需要所運用的數(shù)據(jù)結構具有擴容能力;許多問題要求時間性能甚于空間占用充分利用堆空間(動態(tài)內(nèi)存)是解決這些問題的關鍵n做法:理解堆空間的使用場合,學習堆空間的使用方法10/28/2021錢能

21、C程序設計教程36使用容器,便是自動使用堆內(nèi)存例如,從abc.txt中讀取諸段落: ifstream in ( abc.txt ) ; vector ps ; / ps.reserve(1100) ; 可以預留 for ( string s ; getline ( in, s ) ; ) ps.push_back(s) ;預留是減小頻繁擴容造成的數(shù)據(jù)移動開銷10/28/2021錢能C程序設計教程37若每個數(shù)據(jù)的處理,都要用到已經(jīng)處理的數(shù)據(jù)時,保存歷史數(shù)據(jù),則可以改善時間性能例如,統(tǒng)計一億之內(nèi)的素數(shù)個數(shù)(原始版): bool isPrime(int n) int sqrtn=sqrt(n*1.0

22、); for(int i=2; i=sqrtn; +i) if(n%i=0) return false; return true;/-int main() int num=0; for(int i=2; i=100000000; +i) if(isPrime(i) num+; coutnumendl;/-10/28/2021錢能C程序設計教程38空間換時間版int main() bitset* p = new bitset; p-set(); for(int i=2; itest(i) for(int j=i*i; jsize(); j+=i) p-reset(j); int num=0; for(int i=2; itest(i) num+; coutnum0 & scanf(%s,b)0) printf(%s, strlen(a)=strlen(b) & cnt(a)=cnt(b)? yesn : non);10/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論