線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1301
推到 Plurk!
推到 Facebook!

關於執行效率的問題

答題得分者是:herbert2
Dianasour
一般會員


發表:9
回覆:8
積分:3
註冊:2007-12-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-29 00:57:01 IP:218.111.xxx.xxx 訂閱
請問一下為何以下的方式中, 使用兩次的 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-29 08:47:32 IP:211.72.xxx.xxx 訂閱
您的
int firstClock = clock();
cout << "Time spent: " << firstClock << "\n";
漏扣程式啟動的時間了吧?
編輯記錄
herbert2 重新編輯於 2008-10-29 08:49:10, 註解 無‧
Dianasour
一般會員


發表:9
回覆:8
積分:3
註冊:2007-12-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-10-29 23:34:22 IP:60.48.xxx.xxx 訂閱
如果要加上一開始執行第一個 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-10-30 11:06:01 IP:59.125.xxx.xxx 訂閱
你的時間差如何計算?

===================引 用 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-10-30 12:20:11 IP:211.72.xxx.xxx 訂閱
用您的程式經反覆多次, 其實兩段所耗用的時間幾乎可以說是一樣的,
有時 (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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-10-30 23:32:02 IP:60.48.xxx.xxx 訂閱
我所計算的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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-10-31 10:18:00 IP:211.72.xxx.xxx 訂閱
小弟不才, 無法回答您的問題!
請上 Google 查 "CPU Tick" 及 "指令周期"!

===================引 用 Dianasour 文 章===================
我所計算的clock值相差了幾乎20, 10次測試都是 (1) > (2)

那麼請問大大要怎麼真正取得 CPU 的處理時間?
Dianasour
一般會員


發表:9
回覆:8
積分:3
註冊:2007-12-25

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-10-31 18:16:13 IP:60.50.xxx.xxx 訂閱
好的, 非常 herbert2 的幫助
我剛用 BCB 測試了, 果然就像您以上所解釋的一樣, 用 VC 才會出現這樣的問題

===================引 用 herbert2 文 章===================
小弟不才, 無法回答您的問題!
請上 Google 查 "CPU Tick" 及 "指令周期"!

===================引 用 Dianasour 文 章===================
我所計算的clock值相差了幾乎20, 10次測試都是 (1) > (2)

那麼請問大大要怎麼真正取得 CPU 的處理時間?
系統時間:2024-05-04 18:55:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!