2008年6月10日

困擾我很久 ... vector&array效能問題

最近又有一個慘痛的教訓
就是在選用vector還是一般的指標陣列來儲存變動的資料
vector真是個好物,只要一直塞東西進去就好
不用管你現在vector陣列的大小為何
vector都會幫你管得很好
但一般的指標陣列就不是了
如果要宣告一個可變長度的陣列
還必須先知道你要宣告的陣列大小
才能做出一個符合你期望元素數量的容器出來
而vector在解構的時後也蠻方便的,呼叫一下Clear()即可
一般陣列又要delete[ ] 再NULL他

是的,剛接觸到vector的人一定會覺得那是一個寶
我剛開始也是這樣
之前決定用vector來寫變動長度的容器,就不會有index計算的問題
用vector::Size()就可以得知你丟進去元素的量有多少
在去存取元素成員,可以減少index超過的問題
一般陣列有時候index沒有設想好的話,超過陣列長度的存取
雖可能不會造成程式的中斷
但是這樣很有可能會得到錯誤的資料
但是後來實際上機測試vector的效能
用一般陣列與vector陣列
建立2000筆資料時
速度是一般陣列遠超過vector
差了大約10~15倍
隨著資料增長
5000資料就差了30~50倍以上
後來才知道vector在插入新元素的時後
其實是在另外一塊夠大的記憶體區域把自己原本的資料複製過去
再把新加入的資料塞入最後面
所以幾乎大部分的時間都在做記憶體搬移的動作
速度蠻讓人蠻失望的
所以阿,一個程式的效能
往往取決於資料結構選定、時間複雜度的減少,記憶體使用狀況節省
要讓程式速度快,那要下的基本功與前置作業真的可不能少阿!
所以,vecor 是在"不得以"的狀況下,才去使用會比較好唷!

這是網路上看到的文章,完全就是我的情形阿 ...
一開始是用到這麼好用的東西,動態陣列這麼方便,操作也超級方便,就用上癮了 ...
沒想到,程式效能跟別人做出來的差好多,一直在想是不是vector的問題,這篇文章完全證實了我的想法!!!就是這樣 .....