2013-02-15 61 views
2

在Delphi中,是否有使用Dataset.Prior而不是Dataset.Next的性能損失?德爾福Dataset.Prior VS Dataset.Next性能

背景:

我有搜索數據集中於特定記錄的程序。我從數據集中的最後一條記錄開始,使用Dataset.Prior反向工作,直到找到匹配項。我之所以採用這種背對背的方法,僅僅是因爲(實際上)我正在尋找的記錄更可能接近數據集的末尾,所以我認爲從後面開始會更快地找到記錄。然而

這個邏輯是基於Dataset.Prior和Dataset.Next或多或少相同的性能開銷的假設。是這樣嗎?

+0

ISAM表可能如DBF,CSV和Paradox一樣工作。 但是現在很少使用ISAM,即使在你的手機中有一個免費的輕型SQL引擎。 而這不是SQL表格的工作方式。如果你想要頂級的Firebird,SQLite,NexusDB和其他靈活的信息存儲,你需要閱讀一些關於SQL的教程,它爲什麼被髮明,它的設計目標是什麼,以及你應該如何使用它。 – 2013-02-15 16:08:58

+2

你的測試證明了什麼?你應該簡單地使用兩種方法來計時你的函數。 – 2013-02-15 17:11:53

+0

爲什麼你不使用SQL? – 2013-02-16 23:23:31

回答

7

這取決於數據集,這是它背後的數據庫非常多。有些甚至不支持它(所謂的'單向數據集')。

問題你描述聽起來像它需要一個更專業的查詢,而不是你目前的解決方案。如果您可以在查詢中指定更多詳細信息,則數據集中的數據將會減少,甚至可能只是您需要的記錄。幾乎在任何情況下,數據庫完成過濾都會更快。

如果您需要做的搜索/過濾代碼,那麼也許你可以問問你的數據庫,以便至少在前面所說的更可能的記錄(可能是日期)的方式對數據進行排序。

但是,如果你還需要知道您的特定數據集,如果是有區別的,你可以通過你們整個數據集,前環備份和恢復前,測量的差異。 爲此,請確保先打開查詢/數據集,然後使用DataSet.Last跳轉到最後一條記錄,因爲某些數據集不會一次獲取所有數據,但會強制它們。之後,您可以循環到第一條記錄,然後再次循環到最後一條記錄,同時使用高精度計數器(QueryPerformanceCounter)測量每個循環。

+0

即使底層遊標是單向的,數據集仍然可以實現'Prev'方法,前提是它不會將當前記錄移出內部數據集的記錄緩存。 – kludg 2013-02-15 21:33:56

+0

+1,我已經刪除了我的答案,因爲我意識到它確實取決於後代數據集是如何實現**的。我從來沒有注意到過去曾使用過的'TWhatEverDataSets'的性能問題(只要光標是'clUseClient'和雙向的) - 但這並不意味着我可以推廣* *所有的* DataSet後代。 – kobik 2013-02-17 16:01:36

0

如果數據集中的行數不是太大,那麼我會使用DataSetProvider將其抽入到ClientDataSet中,然後在該ClientDataSet中進行排序,過濾,搜索等操作。

由於您傾向於走大部分記錄,所以一開始獲取記錄的一次性成本可能會減少搜索時間。

如果此sowkr對於您和您有合適的許可證,您甚至可以使用DataSnap方式並完全跳過DAL-secific數據集並將所有內容都抽取到ClientDataSet中。

+2

這並沒有解決所有問題。 – 2013-02-15 19:24:29

+0

我發佈了它,因爲我認爲它回答了一個基本問題。也許我在字裏行間的閱讀是錯誤的。希望OP能讓我們知道。 – 2013-02-15 19:54:27