Translate

2017/08/14

Memory Table had face-off, FdMemTable vs VirtualTable vs ClientDataSet, Part 1: Add Data (CHT)


最近在技術群組裡看到有人在爭論寫入資料庫的方式孰優孰劣,看著到資料庫在自動化寫入資料庫的方式,也會影響寫入結果,這引發了我的好奇心,就自己來測試看看在飛快的記憶體表格操作,如果程式寫得不好,會有多大的影響。

 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 Record
Table Structure: Integer, String, String; 3 Fields
Record unit: ms

以 ClientDataSet 為例:

由上圖可知, Insert 遠比 Append 要花更多的時間。

接著是每累加一萬筆時所需的時間:

隨著資料量越多,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:



沒有留言:

張貼留言

DataSnap REST + JS framework = full stack development (CHT)

ExpressWeb Framework, IntraWeb, UniGUI, Raudus, Elevate Web Builder, Kitto, Delphi MVC Framework... Delphi 這麼多 Web Solution 中,你用過哪幾種? ...