作業2
一 對本周作業中的功能4(僅由文件重定向讀入,不由控制臺輸入)做效能分析
因為我是用c語言寫的代碼,所以重定向不難 只需要用freopen(“”文件路徑“”,“”讀寫方式“”,"stdin")來做。結束的時候不要忘了fclose()就可以,例子如截圖
我個人認為效能分析是程序對cpu和內存占用的綜合參數,完成這個功能真的很坎坷,我沒做過測試,我做的功能是使用c++實現的,所以我下的是vc,我查了一下測試用vs,所以我下了個vs2012,花了我2個小時,安裝的時候已經十點多了,晚上十二點還沒有裝完,所以我沒有關機,早上發現沒安裝成功,心裏非常煩躁。我早上6點就起來了。然後我又下了個vs2015這次下載3個小時,唯一感到慶幸的安裝成功了。我上網百度了下怎麽效能分析,操作如下 。
1 單擊分析按鈕
2性能向導打鉤
3 選擇cpu采樣
這樣就開始進行了效能測試。
運行程序
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 #include<fstream> 5 #include<string> 6 #include<map> 7View Code#include <iomanip> 8 using namespace std; 9 int main() 10 { 11 FILE *fp; 12 char text[1024]; 13 char s[100]; 14 //gets(s); 15 printf(">wf -s < the_show_of_the_ring\n"); 16 fp=freopen("d:\\是.txt","r",stdin); 17 //fp=freopen("功能4.FILE","r",stdout==NULL); 18 //fp=fopen(s,"r");19 int n=0; 20 int i; 21 map<string,int>my_map; 22 while(fgets(text,1024,fp)!=NULL) 23 { 24 // puts(text); 25 i=0; 26 while(text[i]!=‘\0‘) 27 { 28 char s[30]; 29 int j=0; 30 while((text[i]>=‘a‘&&text[i]<=‘z‘)||(text[i]>=‘A‘&&text[i]<=‘Z‘)) 31 { 32 if(text[i]>=‘A‘&&text[i]<=‘Z‘) 33 text[i]+=‘a‘-‘A‘; 34 s[j++]=text[i++]; 35 } 36 s[j]=‘\0‘; 37 if(my_map[s]==0) 38 n++; 39 my_map[s]++; 40 if(text[i]==‘\0‘) break; 41 else 42 i++; 43 } 44 45 } 46 fclose(fp); 47 map<string,int>::iterator it; 48 printf("\n\n"); 49 // printf(">wf -s test.txt\n"); 50 cout<<"total"<<" "<<n-1<<" words"<<endl<<endl<<endl; 51 for(it=my_map.begin(),i=1;it!=my_map.end();it++,i++) 52 { 53 if(it->first=="") 54 continue; 55 cout<<left; 56 cout<<setw(10)<<it->first; 57 cout<<setw(10)<<it->second; 58 cout<<" "; 59 if(i%10==0) 60 // cout<<‘\n‘; 61 printf("\n"); 62 } 63 cout<<‘\n‘; 64 return 0; 65 }
效能分析的時候,我也當我把vc的代碼粘貼到vs裏面發下需要調一下程序,我改了兩個vs裏面的設置,具體沒截圖,很難受,分析結果如下:
1 cup使用百分比
我在網上看的是摘要(S) 還有函數詳細信息(D)
結果如下
二 要求 0 以戰爭與和平 作為輸入文件,重定向(我覺得老師寫錯了)由文件系統讀入連續三次運行,給出每次消耗時間,cpu參數。
1
2
3
要求一
我覺得這段代碼可以優化
1 while(fgets(text,1024,fp)!=NULL) 2 { 3 // puts(text); 4 i=0; 5 while(text[i]!=‘\0‘) 6 { 7 char s[30]; 8 int j=0; 9 while((text[i]>=‘a‘&&text[i]<=‘z‘)||(text[i]>=‘A‘&&text[i]<=‘Z‘)) 10 { 11 if(text[i]>=‘A‘&&text[i]<=‘Z‘) 12 text[i]+=‘a‘-‘A‘; 13 s[j++]=text[i++]; 14 } 15 s[j]=‘\0‘; 16 if(my_map[s]==0) 17 n++; 18 my_map[s]++; 19 if(text[i]==‘\0‘) break; 20 else 21 i++; 22 } 23 24 }View Code
可以把fgets()函數裏面的數值變小,減小數組的存儲空間
主函數由98.05%變成了97.76%
要求2
通過profile找出程序的瓶頸。給出程序運行中最花費時間的三個函數(或代碼片段)。要求包括截圖。
我認為這三個函數最花費時間25853,此三個函數運行時間長,花費cpu多。
要求3
根據瓶頸,“”盡力而為“”地優化程序性能
這個不會改進
要求4
再次profile,給出在要求1中花費時間的三個函數此時的花費,要求包括截圖。
花費了25140秒
要求 5
程序運行時間,根據在教師的機器上運行的速度排名,分為三檔。此題得分,第一檔20分,第二檔10分,第三檔5飛,功能測試不能通過的,0分
作業2