Re: [問題] deque vs vector

看板C_and_CPP作者 (藍影)時間14年前 (2011/10/05 11:06), 編輯推噓4(4019)
留言23則, 5人參與, 最新討論串3/3 (看更多)
※ 引述《pracinverse (改)》之銘言: : ※ 引述《pracinverse (改)》之銘言: : : STL源碼剖析提到deque的複雜度較vector高,所以使用Algorithm 的sort()時,vector會比較怏。 : : 可是我使用VC2005測試發現,deque 使用sort()反而比Vector快,這是為什麼呢? : 我換用vc++ 2008 express,結果還是一樣, : vector所花的時間比較久 恕刪。 往下說之前,我希望你能知道「編譯參數」是幹嘛的, 簡而言之,它是告訴你手邊的 compiler ,我的原始碼請幫我做過 「xxxx」程序的動作,再生成執行檔,其中 「xxxx」有很多可能含義 最快速度 最小空間 完全不優化 加快浮點運算(較不準確) 產生asm 這些都有可能,就看編譯參數是怎麼下的,慶幸的是, VC 這部份做得很讚,Alt + F7, 切到「組態屬性」-> 「C/C++」, 幾乎所有編譯時之相關參數都在裡面。 上一帖推文中雖給了很多實際數據,我想提一下為何會有此情況發生, 不確定是否所有 compiler 實際上都是這麼做,但就我所知 VS 它是這麼做。 以下討論之範圍,暫定此份 source code http://codepad.org/raJwLlUT --- 一般而言,在 VC 之 IDE 底下,會有分 Debug / Release 專案模式, 除了預設之編譯參數不同外 ( 編譯參數可以講很久,最大差別在於 Debug 專案模式較以穩建式的開發, 所有的優化功能都關掉,也多做了一些檢查的動作。 ) 最大的差別在於,執行時,調用之動態連結檔 (.dll) 不一樣, 以 VC 2008 而言,上述程式碼於 debug mode 用到之 dll 為 ntdll.dll kernel32.dll msvcp90d.dll msvcr90d.dll 而在 release mode 底下,常用之兩個動態連結檔為 ntdll.dll kernel32.dll msvcp90.dll msvcr90.dll 於是在函式在執行速度上會有所差異。而你測得的結果,只能說明了, 在 debug mode , 不開任何優化情況下, deque sort 速度小勝 vector sort 速度; 在 vc release mode 預設編譯參數下 (有開o2), vector sort 速度 大勝 deque sort 速度 (應算是大勝吧 ?)。 這是我手邊環境測得之結果 http://ppt.cc/iXik , 但 , 它的確也只能供參考。 因不同 compiler , 出來的結果未必會一模一樣, 甚至糟一點的狀況是 (不是此狀況), 在 A compiler, method 1 > method 2; 在 B compiler, method 2 > method 1; 還有更糟的嗎?有,在同一個 compiler 底下,即使都關了優化(或同時開啟優化), method1 ?? method2 效率上並不明顯有所差異,意即效率都關係著參數怎麼下, 這也是為何一些在講究一點點點點效率差異的文章,必須列出編譯參數之因。 至於其它的東西,實在與 compiler 本身實做與本質有太大之影響, 於此不再深入探討。 希望上述解釋,能解決您的問題。 若發表有誤,或其他意見,也請各位版友不吝指教, 謝謝收聽。 -- No matter how gifted you are, alone, can not change the world. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.78.41

10/05 11:23, , 1F
推!
10/05 11:23, 1F

10/05 14:31, , 2F
除了release之外,更新VStudio的ServicePack也會有差異,
10/05 14:31, 2F

10/05 14:32, , 3F
更新前與更新後編譯的程式,兩者是不一樣的。
10/05 14:32, 3F

10/05 14:34, , 4F
不建議用release,它似乎是以編程人員的電腦來做優化的。
10/05 14:34, 4F
Service Pack 是泛指 SP1 嗎 ? 若是的話, SP1 , 較像是 extension library 、原版 IDE 外掛, 除非 SP1 有改到 CL.exe 或 LINK.exe , 否則不太可能編出來不一樣, 頂多就再多了幾個不同 .dll 而已。 另我以為在早期 vc6 即使很多 bug, 乃受到愛戴的原因, 其中一個便是因為它 opt. 在當時做得夠快!

10/05 14:39, , 5F
release 可以選對哪種環境最佳化, debug 實在是慢到不行
10/05 14:39, 5F

10/05 14:41, , 6F
以編程人員的電腦來做優化 -> 好像沒有吧
10/05 14:41, 6F

10/05 14:57, , 7F
怎麼可能是以編程人員的電腦為準
10/05 14:57, 7F

10/05 14:58, , 8F
用debug為了可以trace,基本上根本不會有任何高階optimize
10/05 14:58, 8F

10/05 14:59, , 9F
教人不要用release太扯了…
10/05 14:59, 9F

10/05 15:13, , 10F
假如不想費時研究優化編譯選項,我覺得release玩玩就好。
10/05 15:13, 10F

10/05 15:15, , 11F
不, 真的在用的 code 都應該用 release. debug 純開發用
10/05 15:15, 11F


10/05 15:18, , 13F
Visual Studio release 的預設並不會用奇怪的硬體設置
10/05 15:18, 13F

10/05 15:18, , 14F
C++ release 和 debug 速度差十倍也常有
10/05 15:18, 14F

10/05 15:22, , 15F
把 VS 打開進屬性頁, 請問除了 /arch 哪個選項會造成
10/05 15:22, 15F

10/05 15:23, , 16F
對某些處理器適用某些不適用的影響?
10/05 15:23, 16F

10/05 15:23, , 17F
(預設的 release)
10/05 15:23, 17F

10/05 16:14, , 18F
VS出那麼多年你有聽過微軟預設的release編出來
10/05 16:14, 18F

10/05 16:14, , 19F
結果某家CPU跑起來有問題的事嗎..
10/05 16:14, 19F

10/05 16:15, , 20F
要說的話微軟的optimize都是偏保守的
10/05 16:15, 20F

10/05 16:15, , 21F
不然以前intel也不會特別出一套ICC了
10/05 16:15, 21F
其實優化能改善的真算的不多,而且每家做 optimize 有限,畢竟都是從 asm 下去著手, 換個角度想,當然不會建議每個 compiler 、 每個參數都去跑,畢竟語言能差的, 效率比不到 100% , 差個 30~50 % 就差很多 , 再差多一點也多不過 5 倍, 但演算法動不動就差了幾百、幾千、幾萬倍,故較少人在比較這部份吧? 開發都以穩健為基礎 (所以通常穩健型的開發是用 debug mode 居多), 但程式發佈給別人如果還用 debug , 另一個人拿到快100倍的 release mode, 這可能誰都會心情不好唷.. 一樣的價, 為什麼別人的程式快了一百倍.. ※ 編輯: tropical72 來自: 180.177.78.41 (10/05 17:37)

10/05 18:06, , 22F
可以milestone先給debug版然後...下一版改release
10/05 18:06, 22F

10/05 18:06, , 23F
程式變小又變快...好棒XD
10/05 18:06, 23F
文章代碼(AID): #1EYydJGq (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1EYydJGq (C_and_CPP)