作者LPH66 (-858993460)
看板C_and_CPP
標題Re: [問題] 指標陣列會影響速度?
時間Mon Mar 28 23:06:31 2011
看得好辛苦....
看在你丟了我水球的份上我回一下好了
※ 引述《mdki19 (JL)》之銘言:
: 我想請問如果把第一段程式碼改寫成第二段程式碼的話
: (不要每次取取記憶體的值,取一次就好)
: 計算的速度是否會提升?
: 我自己測試結果是有差
: 但是不確定
我來上個色兼重排版比較好講
for(i=1;i<8;i++)
{
first_bin_min[i] = min(
Multi_Vote[multi_x].first_bin[i] ,
pDoc->Img_Info[y].Multi_Info[multi_x].edgelet1_first_bin[i]
);
first_bin_score[i] =
first_bin_min[i]/
(Multi_Vote[multi_x].first_bin[i] +
pDoc->Img_Info[y].Multi_Info[multi_x].edgelet1_first_bin[i] -
first_bin_min[i]);
if(
(Multi_Vote[multi_x].first_bin[i] +
pDoc->Img_Info[y].Multi_Info[multi_x].edgelet1_first_bin[i] -
first_bin_min[i]) == 0)
first_bin_score[i] = 0;
}
(第二段恕刪)
你這段程式該做的其實不是只有你所改的那樣而已 你改的那個只是小 case 而已
我這樣排版+上色之後 才比較容易看出你要做的是
"把兩個數中的小數除以大數 如果大數為 0 就令結果為 0"
兩個數分別是標
紅字和
綠字的兩個東西
因此
黃字是兩數中的小數 而
藍底的則是兩數中的大數
這麼長一串的指令我想你寫完過個一個月再回來看就看不懂了
那麼 我把它改成這樣你覺得如何:
for(i=1; i<8; i++)
{
double
minval = min(
Multi_Vote[multi_x].first_bin[i],
pDoc->Img_Info[y].Multi_Info[multi_x].edgelet1_first_bin[i]
);
double
maxval = max(
Multi_Vote[multi_x].first_bin[i],
pDoc->Img_Info[y].Multi_Info[multi_x].edgelet1_first_bin[i]
);
if(
maxval == 0)
first_bin_score[i] = 0;
else
first_bin_score[i] =
minval /
maxval;
}
功能一模一樣 (你可以看我對應上的色) 但這樣是否就清楚的表示了你所要的事情?
而且以你的"需求"來看
你的第一段每圈做了陣列取值九次
第二段只不過改進到每段陣列取值六次
我這樣改每圈陣列取值只有四次而已...
(再龜毛一點可以改到剩兩次 不過那沒必要)
況且你這個迴圈只有八圈 改進這種東西並不會對總時間造成多少的影響
不如改成一個讀起來好懂的東西來的有用
---
另外
不要為了那一丁點效率去用 a+b-min(a,b) 來算 max(a,b)
而且說不定這樣寫並沒有省到什麼
即使省去了一個比較分支但換來了兩個算術運算
但像原 PO 這種情形每次存取 a b 都要經過一大串的指標存取
其實並沒有省到哪裡去....
這也就是為什麼我在我改寫的這一段裡改成直接用 min 和 max 簡潔明瞭
--
1989/02/22 優希堂悟 1990/02/22 冬川こころ 1993/07/05 小町つぐみ 1994/05/21 高江
ミュウ 1995/04 歡迎來到 星野遊々 1997/03/24 守野いづみ 1997/03/24 伊野瀬チサト
1998/06/18 守野くるみ 1999/10/19 打越鋼太郎的 楠田ゆに 2000/02/15 樋口遙 2002/
12/17 八神ココ 2011/01/11 HAL18於朱倉岳墜機 2011/04/02 ∞與∫的世界 茜崎空啟動
2012/05/21 第貮日蝕計畫預定 2017/05/01~07 LeMU崩壞事故 2019/04/01~07 某大學合宿
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.133
推 mdki19:非常謝謝您 03/28 23:15
推 james732:這麼用心的說明真的只能大推了 03/28 23:16
推 loveme00835:我覺得減到兩次是必要的, 不只為了效率也為了可讀性 03/28 23:18
→ loveme00835:再來就是架構上的問題, 如果存取一個資料需要這麼長的 03/28 23:19
→ loveme00835:取值動作, 原原po需要考慮的是加入好用的存取介面, 或 03/28 23:20
→ loveme00835:是委派給中間人作處理, 而這些資料有關卻離你這麼遠, 03/28 23:21
→ loveme00835:類別也需要重新設計了, MVC不要死背 03/28 23:22
推 xshaddockx:寫的真清楚明瞭,推一個 03/29 00:15
推 cobrasgo:原來的可讀性真的不太好… 03/29 00:38