關於執行效率的問題 |
答題得分者是:herbert2
|
Dianasour
一般會員 發表:9 回覆:8 積分:3 註冊:2007-12-25 發送簡訊給我 |
請問一下為何以下的方式中, 使用兩次的 for 會比一次的方式要來得快呢??
[code cpp] #include #include using namespace std; int main() { for(int i=0; i<50000; i ) { int a[] = {0,0,0,0,0,0,0,0,0,0}; int b[] = {0,0,0,0,0,0,0,0,0,0}; for(int j=0; j<10; j ) { b[j] = int(10 * rand() / (RAND_MAX 1)); a[b[j]] ; } } int firstClock = clock(); cout << "Time spent: " << firstClock << "\n"; for(int i=0; i<50000; i ) { int a[] = {0,0,0,0,0,0,0,0,0,0}; int b[] = {0,0,0,0,0,0,0,0,0,0}; for(int j=0; j<10; j ) b[j] = int(10 * rand() / (RAND_MAX 1)); for(int j=0; j<10; j ) a[b[j]] ; } int secondClock = clock() - firstClock; cout << "Time spent: " << secondClock << "\n"; system("pause"); return 0; } [/code] |
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
|
Dianasour
一般會員 發表:9 回覆:8 積分:3 註冊:2007-12-25 發送簡訊給我 |
如果要加上一開始執行第一個 for 的時間的話也都是一樣
可以把兩段分別拆開來運行, 但結果都是一樣, 所以我不知道為何會出現這樣的情況 [code cpp] #include #include using namespace std; int main() { for(int i=0; i<50000; i ) { int a[] = {0,0,0,0,0,0,0,0,0,0}; int b[] = {0,0,0,0,0,0,0,0,0,0}; for(int j=0; j<10; j ) { b[j] = int(10 * rand() / (RAND_MAX 1)); a[b[j]] ; } } cout << "Time spend: " << clock() << "\n"; system("pause"); return 0; } [/code] [code cpp] #include #include using namespace std; int main() { for(int i=0; i<50000; i ) { int a[] = {0,0,0,0,0,0,0,0,0,0}; int b[] = {0,0,0,0,0,0,0,0,0,0}; for(int j=0; j<10; j ) b[j] = int(10 * rand() / (RAND_MAX 1)); for(int j=0; j<10; j ) a[b[j]] ; } cout << "Time spend: " << clock() << "\n"; system("pause"); return 0; } [/code] ===================引 用 herbert2 文 章=================== 您的 int firstClock = clock(); cout << "Time spent: " << firstClock << "\n"; 漏扣程式啟動的時間了吧? |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
你的時間差如何計算?
===================引 用 Dianasour 文 章=================== 如果要加上一開始執行第一個 for 的時間的話也都是一樣 可以把兩段分別拆開來運行, 但結果都是一樣, 所以我不知道為何會出現這樣的情況 [code cpp] #include #include using namespace std; int main() { for(int i=0; i<50000; i ) { int a[] = {0,0,0,0,0,0,0,0,0,0}; int b[] = {0,0,0,0,0,0,0,0,0,0}; for(int j=0; j<10; j ) { b[j] = int(10 * rand() / (RAND_MAX 1)); a[b[j]] ; } } cout << "Time spend: " << clock() << "\n"; system("pause"); return 0; } [/code] [code cpp] #include #include using namespace std; int main() { for(int i=0; i<50000; i ) { int a[] = {0,0,0,0,0,0,0,0,0,0}; int b[] = {0,0,0,0,0,0,0,0,0,0}; for(int j=0; j<10; j ) b[j] = int(10 * rand() / (RAND_MAX 1)); for(int j=0; j<10; j ) a[b[j]] ; } cout << "Time spend: " << clock() << "\n"; system("pause"); return 0; } [/code] ===================引 用 herbert2 文 章=================== 您的 int firstClock = clock(); cout << "Time spent: " << firstClock << "\n"; 漏扣程式啟動的時間了吧? |
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
用您的程式經反覆多次, 其實兩段所耗用的時間幾乎可以說是一樣的,
有時 (1) < (2), 有時 (1) == (2), 有時 (1) > (2). CPU 的頻率事實上也非完全固定的 (市電之電壓也是不斷地上下變動的), Windows 系統是多工的, 不僅只處理一支程式, 還有常駐的 Service 、防毒軟體等, 因此, 理論上, (1) == (2) 是可以成立的. 要真正測程式的效率, 應以其程式碼耗費多少 CPU 工作時間來計算, 用 Clock() 是不準確的. 例如讀取磁碟資料, 讀一個磁區離散檔就比讀一個同 Size 但磁區連續的檔耗時, 但程式碼是相同的.
編輯記錄
herbert2 重新編輯於 2008-10-30 22:00:56, 註解 無‧
|
Dianasour
一般會員 發表:9 回覆:8 積分:3 註冊:2007-12-25 發送簡訊給我 |
我所計算的clock值相差了幾乎20, 10次測試都是 (1) > (2)
那麼請問大大要怎麼真正取得 CPU 的處理時間? ===================引 用 herbert2 文 章=================== 用您的程式經反覆多次, 其實兩段所耗用的時間幾乎可以說是一樣的, 有時 (1) < (2), 有時 (1) == (2), 有時 (1) > (2). CPU 的頻率事實上也非完全固定的 (市電之電壓也是不斷地上下變動的), Windows 系統是多工的, 不僅只處理一支程式, 還有常駐的 Service 、防毒軟體等, 因此, 理論上, (1) == (2) 是可以成立的. 要真正測程式的效率, 應以其程式碼耗費多少 CPU 工作時間來計算, 用 Clock() 是不準確的. 例如讀取磁碟資料, 讀一個磁區離散檔就比讀一個同 Size 但磁區連續的檔耗時, 但程式碼是相同的. |
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
|
Dianasour
一般會員 發表:9 回覆:8 積分:3 註冊:2007-12-25 發送簡訊給我 |
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |