程式設計珠璣(續) 第一章 效能監視工具

2021-08-26 22:35:38 字數 1648 閱讀 4220

一,計算素數

第乙個程式:如果整數n,從2開始到n-1都不能整除則為素數。注意,n=2時一定是素數的判斷

#include using namespace std;

int prime(int n)

int main()

int prime(int n)

int main()

int prime(int n)

int main()

int prime(int n)

int main()

int main()

{ int i,n;

n=1000;

for(i = 2; i <= n; i++)

if (prime(i))

cout<

二,效能檢測工具

在linux系統下:

find . -name "*.c" |xargs wc -l

time — 執行命令並計時

time find . -name "*.c" |xargs wc -l // 統計執行命令時間

real 0m33.748s

user 0m0.772s

sys 0m1.044s

1)實際時間(real time): 從command命令列開始執行到執行終止的消逝時間;

2)使用者cpu時間(user cpu time): 命令執行完成花費的使用者cpu時間,即命令在使用者態中執行時間總和;

3)系統cpu時間(system cpu time): 命令執行完成花費的系統cpu時間,即命令在核心態中執行時間總和。

其中,使用者cpu時間和系統cpu時間之和為cpu時間,即命令占用cpu執行的時間總和。實際時間要大於cpu時間,因為linux是多工作業系統,往往在執行一條命令時,系統還要處理其它任務。

另乙個需要注意的問題是即使每次執行相同命令,但所花費的時間也是不一樣,其花費時間是與系統執行相關的。

**的效能檢測,統計每個函式呼叫次數。額可以檢測哪個函式占用大量cpu時間,從而有效更改程式。

三,習題

2)實現簡單的埃氏篩法(sieve of eratosthenes)來計算所有小於n的素數。這個程式的主要資料結構是乙個n位元的陣列,初始值都為真。每發現乙個素數時,陣列中所有這個素數的倍數就設定為假。下乙個素數就是陣列中下乙個為真的位元。

答案:下面的c程式實現了埃氏篩法來計算所有小於n的素數。其基本資料結構是n位元陣列x,初始值全部為1。每發現乙個素數,陣列中所有它的倍數都設為0。下乙個素數就是陣列中的下乙個取值為1的位元位。效能監視表明小於100000的素數有9592個,演算法進行了大概2.57n次賦值。一般地,演算法進行nloglogn次賦值;演算法分析中涉及到答案1.1中的素數密度和調和數。下面是加上效能監視後的**:

#include using namespace std;

int main()

{

int i, p, n;

char x[100002];

n = 100000;

for (i = 1; i <= n; i++)

x[i] = 1;

x[1] = 0; //1不是素數

x[n+1] = 1;

p = 2;

while (p <= n)

{ cout<

程式設計珠璣第一章

原文中的問題 如何在1mb的空間裡面對一千萬個整數進行排序?並且每個數都小於1千萬。實際上這個需要1.25mb的記憶體空間。1mb總共有838,8608。所以估計也可以在1mb左右的空間裡面進行排序了。include include define bitsperword 32 define shif...

程式設計珠璣第一章

下午看完程式設計珠璣第一章,感覺很不錯!如作者所說 閱讀本書乙個提示,不要太快,一次閱讀一章。集中精力思考,解答課後習題。寫總結就是在剛弄懂的時候,這時候是最恰當的時候,最容易接受。題目要求 乙個最多含有1000萬個整數的檔案,整數沒有重複,請輸出公升序排列。約束 最多1m記憶體,時間10s。題目很...

《程式設計珠璣》第一章筆記

文章從乙個實際的問題開始 乙個 系統,7位數的 號碼,用1mb的記憶體空間將這些 號碼排序。分析 如果將這些 號碼看成int型別的整數,將其讀入記憶體中進行排序,int型別4個位元組,最多有10000000個 號碼,則需要40mb的記憶體空間,遠遠超出題目的要求,但是這10000000個資料有他們的...