顯示具有 程式 標籤的文章。 顯示所有文章
顯示具有 程式 標籤的文章。 顯示所有文章

2017年1月10日

Timer 執行完前次工作後再倒數

這裡用的Timer是System.Threading.Timer;

目的是在倒數計時的程式中,不要前一次工作還沒完成,下一次工作就開始執行。

看到兩種作法

  1. 用Thread中的Monitor去鎖定物件來做控制
  2. 改變計時器時間(這個比較準)

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的問題,這篇文章完全證實了我的想法!!!就是這樣 .....

2008年5月5日

以程式哲學改善工作效率

根據Eric Steven Raymond的自由閱讀著作「The Art of Unix Programming」,作者Gina Trapani根據「Unix哲學的基礎」這一章,歸納出了幾個無論對於寫程式、或是改善個人生活與工作效率都很有用的原則;這裡摘錄標題並簡介如下:

1. 將資訊切割成單純的片段,再用乾淨的介面將它們連結起來(模組原則)



例如用不同的工具(軟體、網站‥‥)來構成管理個人資訊和時間的系統;功能和資訊過度集中、過度複雜的做法,可能不利於個別部份的升級和更新。

2. 以資訊的呈現方式而言,清楚比小聰明重要(清楚原則)



記錄資訊的時候儘可能清楚易懂;例如備忘事項寫「問老王怎麼開公司,電話1234-5678」就比「來開公司吧」有用。同樣的,用這種精神來寫程式,也會讓下一個處理的人輕鬆得多,尤其那個人可能是幾年後的自己。

3. 將資料跟使用方法寫在一起,讓運用過程簡單又防呆(形式原則)



一開始就把完成工作所需的所有資訊準備好。例如在記錄「打電話給老王」提醒事項時,順手就把電話號碼寫上去;去一個新地方之前,把完整的地址電話等資料寫在隨身筆記上。

4. 如果事情非死不可,就讓它死得流芳百世(修正原則)



通常我們會儘可能隱瞞失敗,但這樣可能只會讓失敗再度發生。詳細檢討自己的失敗內容、找出失敗原因,然後找出解決方法。生活中的很多事情跟軟體開發一樣,都是不斷循環的流程,壞的地方沒有修好,下次還是會碰到。

5. 人的時間比電腦的時間更珍貴(經濟原則)



能讓電腦做的事情,就不要自己做。善用快捷鍵、將備份資料之類常做的工作自動化,縮短自己做這些事情的時間。讓電腦幫你做事,而不是你幫電腦做事。

6. 先把雛形做好再修整、系統能動了再減肥(優化原則)



無論做什麼事情,有用的方法或工具就是最好的;一旦找到好的工具,就先開始用,然後再慢慢調整使用方式,會跑比看起來漂亮更重要。

7. 時時考慮未來,因為它降臨的速度比你想像的快(擴充原則)



很少有工具可以用一輩子;所以無論資料或工作方式,都不要被現在的工具給鎖死,要讓它們隨著你一起成長。

*****
會想摘錄這幾條看似簡單的原則,是因為雖然簡單、卻打中了許多我們因而常常忘記的事情。

至少我自己是如此:常常記下要打電話給某人,卻沒有順手把電話抄下來,於是第二天還得花一次時間去查;也有很多設計師因為執著於某一小部份作品的完美,而曠日費時於修理幾乎無關緊要的小地方,卻忽略了整體的平衡整合、或是延誤了完成的時間。

寫程式也好、安排自己的工作或時間也好,很多提升效率的道理是共通的,端看我們是否忽略忘記、或者因為自己的執念而明知故犯,如此而已。