Re: [問題] 指標陣列會影響速度?

看板C_and_CPP作者 (-858993460)時間14年前 (2011/03/28 23:06), 編輯推噓5(505)
留言10則, 5人參與, 最新討論串2/2 (看更多)
看得好辛苦.... 看在你丟了我水球的份上我回一下好了 ※ 引述《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

03/28 23:15, , 1F
非常謝謝您
03/28 23:15, 1F

03/28 23:16, , 2F
這麼用心的說明真的只能大推了
03/28 23:16, 2F

03/28 23:18, , 3F
我覺得減到兩次是必要的, 不只為了效率也為了可讀性
03/28 23:18, 3F

03/28 23:18, , 4F

03/28 23:19, , 5F
再來就是架構上的問題, 如果存取一個資料需要這麼長的
03/28 23:19, 5F

03/28 23:20, , 6F
取值動作, 原原po需要考慮的是加入好用的存取介面, 或
03/28 23:20, 6F

03/28 23:21, , 7F
是委派給中間人作處理, 而這些資料有關卻離你這麼遠,
03/28 23:21, 7F

03/28 23:22, , 8F
類別也需要重新設計了, MVC不要死背
03/28 23:22, 8F

03/29 00:15, , 9F
寫的真清楚明瞭,推一個
03/29 00:15, 9F

03/29 00:38, , 10F
原來的可讀性真的不太好…
03/29 00:38, 10F
文章代碼(AID): #1DaAFwEt (C_and_CPP)
文章代碼(AID): #1DaAFwEt (C_and_CPP)