1. 程式人生 > >作業2

作業2

方式 排名 控制臺 -1 上網 fstream 信息 運行程序 one

一 對本周作業中的功能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>
 7
#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 }
View Code

技術分享

效能分析的時候,我也當我把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