請問 加法跟乘法 |
尚未結案
|
yungfan
一般會員 發表:25 回覆:13 積分:7 註冊:2003-12-29 發送簡訊給我 |
各位大大 我原本的程式如下:
double sum,A[32],filter[32][32] for(i=0;i<32;i ){ sum=0; for(k=0;k<32;k ){ sum = A[k]*filter[i][k]; } }因為k在0~31中對稱,所以可以把A陣列先前後相加或相減再乘上filter,而程式更改如下: double sum1,sum2,A[32],filter[32][32] for(i=0;i<32;i=i 2){ sum1=0; sum2=0; for(k=0;k<16;k ){ sum1 =(A[k] A[31-k])*filter[i][k]; sum2 =(A[k]-A[31-k])*filter[i 1][k]; } }不管累加的話: 程式一:32x32次的乘法 程式二:16x32次的乘法及16x32次的加法 結果執行的速度是程式一的比較快,想請問一下,為什麼加法會比乘法來的慢呢?? |
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
您的程式1:應有
double 運算: 32x32 次的乘及 32x32 次的加(sum+=)
int 運算: 32x32 次的加(k++) + 32 次的加(i++) 共 32*33=1056 次加
int比較運算: 32x33 次(k<32) + 33 次(i<32) 共 33*33 次比較 程式2:應有
double 運算: 16x32 次的乘及 32x32 次的加(sum = 及 A[] -A[])
int 運算:加減 16x16 次(k ) + 16x16x3 次([31-k],[i 1]) + 16 次(i 2) 共 1040 次
int比較運算: 16x17 次(k<16) + 17 次(i<32) 共 17*17 次比較 當然,如果還要再細分也可以 我按您的程式實測,以 [ class="code">
// 程式1
DWORD START=GetTickCount();
for(int i=0;i<3200;i ){
sum=0;
for(int k=0;k<3200;k ){
sum = A[k]*filter[i][k];
}
}
DWORD DIFF=GetTickCount()-START;
// 程式2 DWORD START=GetTickCount(); for(int i=0;i<3200;i=i 2){ sum1=0; sum2=0; for(int k=0;k<1600;k ){ sum1 =(A[k] A[3119-k])*filter[i][k]; sum2 =(A[k]-A[3119-k])*filter[i 1][k]; } } DWORD DIFF=GetTickCount()-START;結果是: 程式1: 125~150 ms 程式2: 47 ~ 62 ms 所以是程式 2 比較快。這樣的結果也比較合理與乘加數正比。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |