最近在技術群組裡看到有人在爭論寫入資料庫的方式孰優孰劣,看著到資料庫在自動化寫入資料庫的方式,也會影響寫入結果,這引發了我的好奇心,就自己來測試看看在飛快的記憶體表格操作,如果程式寫得不好,會有多大的影響。
Delphi 的 TDataSet 在新增上有兩個著名的操作方法:
- INSERT
- APPEND
What is "INSERT"?
Inserts a new, empty record in the dataset.What is "APPEND"?
Adds a new, empty record to the end of the dataset.這兩者的比較,居然有人說 INSERT 比 APPEND 的效能要來得好,真是意外,我以前的印象中,記得是 APPEND 要來得快,但已經不記得快多少,現在就來把測試結果寫下來,看這兩者到底的效能差別到底有多大。
測試方式:
Test time:100000 RecordTable Structure: Integer, String, String; 3 Fields
Record unit: ms
以 ClientDataSet 為例:
接著是每累加一萬筆時所需的時間:
隨著資料量越多,Insert 所需的時間就越長,當九萬至十萬筆時,就需要花上 797 ms 的時間。
結果很明顯,Append 勝出。
但這樣結果實在是太無趣了!
ClientDataSet是一種 Memory Table,如果把其它的 Memory Table 一起抓來比較的話……
說到 Memory Table 的選擇非常多,以下是本次參戰的選手:
- FireDAC -- TFdMemTable
- Devart -- TVirtualTable
- DataSnap -- TClientDataSet
FireDAC -- TFdMemTable
就像 ClientDataSet 一樣,FdMemTable 在 Insert 明顯比 Append 花更多的時間。
Devart -- VirtualTable
VirtualTable 也可以看到 Insert 也要比 Append 要久。
但請注意!32 ms 的總差距在體感上其實是差不多的!
*意謂著使用 VirtualTable 的人可以不用太在意程式細節 (笑)
大亂鬥
選手們都已經完成個人賽事,接下來就要登台對決:總結
僅管記憶體非常快,但操作不慎仍有可能造成效能悲劇。在大量新增的場合,使用 Append 的方式絕對是最佳作法。
以上總結在 VirtualTable 是個例外。(笑)
ClientDataSet 在 Insert / Append 效能落差最大,有在使用它的人要注意手上的程式碼優化工作。
FdMemTable 作為未來 ClientDataSet 的接班人,對效能偏執狂的開發者來說還不夠好,請再繼續加油。
「DBNavigator.Insert」和 ActionList 裡的「TDataSetInsert」兩者都是【Insert】行為,而且它們都沒有【Append】,需要的話則須人工修改。所幸在【一般使用者】的場合下,不會有太大的影響。
下次誰再跟我說 Insert 效能比 Append 好就踹飛他!
See also:
沒有留言:
張貼留言