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

[請問]執行速度的差別

尚未結案
yungfan
一般會員


發表:25
回覆:13
積分:7
註冊:2003-12-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-04-12 22:08:19 IP:218.165.xxx.xxx 未訂閱
請問一下,若我有設一個陣列比如:X[100]且X[50]=50; 那麼 a=2*25; b=X[2*25]; 兩者皆有2*25,但在編譯成組語之後兩者所花費的clk有何差別呢?? (因為我的程式有效能上的考量,希望把一些會用到乘法的算式建表) 煩請幫我解答一下…謝謝啦!! 發表人 - yungfan 於 2004/04/13 00:31:22
dhchang
一般會員


發表:7
回覆:9
積分:8
註冊:2003-05-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-04-13 13:01:34 IP:61.30.xxx.xxx 未訂閱
如果是 * 2 使用位元 shift 會不會比較快?
yungfan
一般會員


發表:25
回覆:13
積分:7
註冊:2003-12-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-04-13 13:18:05 IP:163.28.xxx.xxx 未訂閱
如果是 * 2 使用位元 shift 會不會比較快? 我不是只有乘2,那是示意啦!! 還是謝謝您的回答!!^^
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-04-13 13:44:52 IP:210.68.xxx.xxx 未訂閱
引言: 請問一下,若我有設一個陣列比如:X[100]且X[50]=50; 那麼 a=2*25; b=X[2*25]; 兩者皆有2*25,但在編譯成組語之後兩者所花費的clk有何差別呢?? (因為我的程式有效能上的考量,希望把一些會用到乘法的算式建表)
恩...你的意思是這樣吧? 方法1: c = 2; a = c *25; b= X[a]; 和 方法2: c = 2; b= X[c*25]; 哪個比較快吧? 第一:澄清一件事 b = X[2 * 25]; 的方式是最快的,因為在編譯時,編譯程式就直接幫你翻譯成組合語言了(因為2*25是常數,而不是變數,至於何謂常數何謂變數...嘿嘿...不在討論範圍) 第二:應該是方法1比較快,因為只要計算一次,這其中的差異,當你的計算式越複雜就越明顯 結語:基本上,除非你的計算式真的『非常』複雜,或是運算的次數非常多,不然其中的差異應該不大喔,尤其如果你的PC快一點的話,根本一點感覺都沒有 當然還有其他方式,增加速度,不過偶建議,還是從邏輯、計算方式下手,畢竟這才是正道
yungfan
一般會員


發表:25
回覆:13
積分:7
註冊:2003-12-29

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-04-13 16:33:19 IP:163.28.xxx.xxx 未訂閱
lu sir. 先謝謝您的回覆^^    我大概了解你的意思了,不過我再把我的程式描述一下, 程式一:   for(i=0;i<100;i ) { a=i*3 ..........} 程式二: for(i=0;i<100;i ) { a=X[i*3] .........} 此時把程式一a的結果預先存在X陣列中,於執行for迴圈時直接抓值; 這樣在應該在執行時才會去對X[i*3]作i*3的運算吧??!! 所以我想問的是此時的乘法是否跟程式一的一樣呢?? 謝謝啦!!
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-04-13 17:28:06 IP:210.68.xxx.xxx 未訂閱
引言: 我大概了解你的意思了,不過我再把我的程式描述一下, 程式一: for(i=0;i<100;i ) { a=i*3 ..........} 程式二: for(i=0;i<100;i ) { a=X[i*3] .........} 此時把程式一a的結果預先存在X陣列中,於執行for迴圈時直接抓值; 這樣在應該在執行時才會去對X[i*3]作i*3的運算吧??!! 是的,在程式二中是在存取X[i*3]時才作i*3的運算 所以我想問的是此時的乘法是否跟程式一的一樣呢?? 偶有點不清楚你上面這句話的用意,偶猜想是不是這樣?
 
int c,i;
int index[100];
int data[1000];
for (int c=0;c<100;c  )
  index[c] = c * 3;    for (int c=0;c<50;c  )
  {
    i = c * 2;
    i = data[ index[i] ];
  }
是這樣嗎? 這即是一般所說的查表法喔,這樣速度會比較快,尤其你Index 陣列用越多次,就越省時間,此一方法通常用在 Index資料的運算是非常複雜的,例如sin , cos ,次方.... 等等 但是如果是這樣
for(i=0;i<100;i  )
  { 
    a=i*3
    a = data[a];
  }
那反而變慢喔,因為 i*3 的結果要先搬到變數a ,在從變數a 搬出來喔,除非你的a會運用粉多次
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-04-14 09:00:35 IP:218.163.xxx.xxx 未訂閱
引言: lu sir. 先謝謝您的回覆^^ 我大概了解你的意思了,不過我再把我的程式描述一下, 程式一: for(i=0;i<100;i ) { a=i*3 ..........} 程式二: for(i=0;i<100;i ) { a=X[i*3] .........} 上面這二個寫法其實都只差一點點。
 b = 0;
  for(i=0;i<100;i  )
    {  
        a=X[b]
        b  = 3;        
      .........}
這樣才會有差別。因為你那二段還是使用了*。
此時把程式一a的結果預先存在X陣列中,於執行for迴圈時直接抓值; 這樣在應該在執行時才會去對X[i*3]作i*3的運算吧??!! 所以我想問的是此時的乘法是否跟程式一的一樣呢?? 謝謝啦!!
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-04-14 11:54:01 IP:210.68.xxx.xxx 未訂閱
引言: b = 0; for(i=0;i<100;i ) { a=X[b] b = 3; .........} 這樣才會有差別。因為你那二段還是使用了*。 此時把程式一a的結果預先存在X陣列中,於執行for迴圈時直接抓值; 這樣在應該在執行時才會去對X[i*3]作i*3的運算吧??!! 所以我想問的是此時的乘法是否跟程式一的一樣呢?? 謝謝啦!!
呵呵~~你陷入一個迷思嘍(偶認為啦 ^^") 對CPU本身而言乘法指令都一樣,只有一個喔,所以迷有所謂的一不一樣的問題喔,差別是,運算完的結果要如何處理... 方法一 a = i*3; X[a]; 方法二 X[i*3]; 方法一和方法二的乘法『當然』都一樣,但是 方法一 的方法比 方法二 會慢一點點,因為方法一必須先將 i*3 的結果搬至變數A,然在取出來,而方法二會直接運算所以會比較快 如果還是不太懂偶在說什麼,提供你一個方法,寫各程式如下
int X[] = {1,2,3,4,5,6,7,8,9,10};
int a,b,c;
c = 1;
a = c*3;
b = X[a];    b = X[c*3];
然後將程式停在 c = 1; 那一行,然後按 Ctrl Alt C叫出組合語言,你看看就知道偶在說什麼了 希望對你有幫助 ^^
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-04-15 10:10:21 IP:218.163.xxx.xxx 未訂閱
引言: 呵呵~~你陷入一個迷思嘍(偶認為啦 ^^") 對CPU本身而言乘法指令都一樣,只有一個喔,所以迷有所謂的一不一樣的問題喔,差別是,運算完的結果要如何處理... 方法一 a = i*3; X[a]; 方法二 X[i*3]; 方法一和方法二的乘法『當然』都一樣,但是 方法一 的方法比 方法二 會慢一點點,因為方法一必須先將 i*3 的結果搬至變數A,然在取出來,而方法二會直接運算所以會比較快 如果還是不太懂偶在說什麼,提供你一個方法,寫各程式如下
int X[] = {1,2,3,4,5,6,7,8,9,10};
int a,b,c;
c = 1;
a = c*3;
b = X[a];    b = X[c*3];
然後將程式停在 c = 1; 那一行,然後按 Ctrl Alt C叫出組合語言,你看看就知道偶在說什麼了 希望對你有幫助 ^^
嗯!我果然陷下去了^^" cpu的乘法指令雖然是只有一個,但是執行這一個指令所要花的週期就不一定跟 mov、add等指令花相同的的時間哦! 不知道現在cpu在做乘法運算是否使用累加的方式運算?
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-04-15 11:09:38 IP:210.68.xxx.xxx 未訂閱
引言: cpu的乘法指令雖然是只有一個,但是執行這一個指令所要花的週期就不一定跟 mov、add等指令花相同的的時間哦! 不知道現在cpu在做乘法運算是否使用累加的方式運算?
不知道ㄝ,問一下,就算有差,有差那麼多嗎? 而且以現在的CPU,隨便都是好幾百MHz 甚至 GHz ,更別說CPU本身的功能了(不管Intel or AMD 都宣稱自家的CPU有一大堆預測等等,其他功能),除非你是運算非常大的數字(例如128位元的數字等等),或是其他複雜的運算,否則實在沒有差喔(偶個人認為差別低於0.001秒,就是沒差) 給你各建議,除非你真的想研究低階語言,不然鼻要把心力花在這上面,因為偶個人認為,寫C OR C的原因就是不想管組合語言,就像寫BCB的程式設計師,不想管那些阿理阿渣的API,只想把心力花在系統的架構、程式的流程以及其他更重要的東西... 以上是偶個人一點小小的意見,偶知道有人認為這個說法不好,當各程式設計師最好從頭懂到尾....當然啦,如果你有時間、有毅力的話偶舉雙手贊成,至於偶自己嘛~~偶則是想把時間花在其他的事情上面,例如:系統的架構、程式的流程等等,還有陪陪偶女友 ^^" ========================= 大家一起快樂寫程式
liangnet
中階會員


發表:19
回覆:148
積分:83
註冊:2004-01-03

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-04-15 13:54:05 IP:218.163.xxx.xxx 未訂閱
引言:
引言: cpu的乘法指令雖然是只有一個,但是執行這一個指令所要花的週期就不一定跟 mov、add等指令花相同的的時間哦! 不知道現在cpu在做乘法運算是否使用累加的方式運算?
不知道ㄝ,問一下,就算有差,有差那麼多嗎? 而且以現在的CPU,隨便都是好幾百MHz 甚至 GHz ,更別說CPU本身的功能了(不管Intel or AMD 都宣稱自家的CPU有一大堆預測等等,其他功能),除非你是運算非常大的數字(例如128位元的數字等等),或是其他複雜的運算,否則實在沒有差喔(偶個人認為差別低於0.001秒,就是沒差) 給你各建議,除非你真的想研究低階語言,不然鼻要把心力花在這上面,因為偶個人認為,寫C OR C的原因就是不想管組合語言,就像寫BCB的程式設計師,不想管那些阿理阿渣的API,只想把心力花在系統的架構、程式的流程以及其他更重要的東西... 以上是偶個人一點小小的意見,偶知道有人認為這個說法不好,當各程式設計師最好從頭懂到尾....當然啦,如果你有時間、有毅力的話偶舉雙手贊成,至於偶自己嘛~~偶則是想把時間花在其他的事情上面,例如:系統的架構、程式的流程等等,還有陪陪偶女友 ^^" ========================= 大家一起快樂寫程式
嗯已現在的cpu的速度那當然是沒差囉! 我是以前DOS混太久了~"~。 以前在寫繪圖的程式就會考慮到用加法or移位的方式來取代乘法。
lu
高階會員


發表:11
回覆:189
積分:195
註冊:2003-11-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-04-15 15:00:11 IP:210.68.xxx.xxx 未訂閱
< >希望對你有幫助,偶剛開始寫>維護程式當然啦,有時效率和速度會被犧牲掉,但是偶越來越覺得沒差了,原因粉簡單現在硬體便宜,太慢~~< ><>換~機~器 ,老闆通常蠻喜歡聽到這樣的話,因為他又有$$可以賺了 反而是維護佔去偶絕大多數的時間..... 參考一下吧 ========================= <>大家一起快樂寫程式
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-04-16 23:03:07 IP:61.219.xxx.xxx 未訂閱
ㄏㄏㄏ,如果你是開發遊戲或繪圖軟體的工程師,你這樣講,準被罵臭頭 如果你是寫商業軟體的,那是比較可以放一邊,但也不該太離譜. 其實程式效率與大小最佳化上在開發軟體上一直是一個需要正視的問題,而且常常只能顧一邊. 舉幾個例子
int X=4*5;
int a[10];
for(int i=0;i<10;i  )
   a[i]=i*X;
與
for(int i=0;i<10;i  )
   a[i]=i*4*5;
這兩個例子誰快ㄋ,誰的程式碼短無庸置疑.
int A;
if(Value)
 A=3;
else
 A=2;
與
int A=2
if(Value)
 A=3;
又如何ㄋ    int X=0;
for(int i=1;i<=10;i  )
 X =i;
與
int X=0;
X =GetValue(1);    int GetValue(X)
{
 if(X>=10)
   return 10;
 return X GetValue(X 1);
}
與
int X=0
X =1;
X =3;
X =4;
.
.
.
X =10;
又如何ㄋ    X=Y%4
與X=Y&0x03
又如何ㄋ
要答案?自己寫好程式然後Deasm去看 漸漸的,你日後寫程式時不知不覺就養成習慣做好最佳化啦! 發表人 - taishyang 於 2004/04/16 23:22:26
系統時間:2024-06-29 16:37:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!