2011-05-17 43 views
1

粗略地說,什麼是的.NET代碼讀取/從Windows註冊表中刪除鍵的表現?它是否類似於文件I/O?更快?更接近內存I/O?比較慢?更接近網絡I/O? (我不能想象......只是陳述的完整性=).net - >註冊表代碼的性能如何?

+0

知道會制定一個測試的唯一方法。但是,真的,爲什麼它很重要?任何訪問註冊表的東西都不應該是時間關鍵的,所以無論是1微秒還是100毫秒,都不應該在程序的運行時間上產生可衡量的差異。 – 2011-05-17 14:17:41

+0

@Jim - 我是自動寫入註冊表的應用程序,我需要撤消一些事情它在註冊表中(該供應商已覈實)做的事情。我的代碼時間緊迫,取決於這個第三方應用程序。所以那個應用程序對我來說是「黑盒子」的。 – SFun28 2011-05-17 14:32:00

回答

2

你甚至不能啓動比較網絡I/O與本地文件I/O /註冊表訪問,因爲有在工作,所以很多因素。

理論上你可以設計出某種檢驗比較文件的讀取與註冊表中讀取,但我不認爲這將是任何好處。此測試仍然可能存在缺陷,因爲它可能取決於您正在閱讀哪些密鑰以及其他可能在後臺讀取註冊表的應用程序。

如果您需要訪問註冊表,然後花費的時間基本上是無能爲力的,因爲你沒有選擇,但這樣做也無妨 - 同樣與文件I/O。

編輯:

快速測試得出以下結果:

  • 100000註冊表中讀取需要1.81 - 1.89小號

  • 100000讀的9個字節的文件需要19.80 - 20.10小號(所以註冊表是多少(〜10倍),更快的:)

    Dim sw As New Stopwatch 
    
    Dim subkey As RegistryKey 
    Dim value As String 
    Dim keyValue As String 
    
    sw.Reset() 
    sw.Start() 
    For i As Integer = 1 To 100000 
        keyValue = "SOFTWARE\Codejock Software\Xtreme SuitePro ActiveX v15.0.2" 
        subkey = Registry.LocalMachine.OpenSubKey(keyValue, False) 
        value = subkey.GetValue("Installation Directory") 
    Next 
    sw.Stop() 
    Debug.WriteLine("Registry Read:" + sw.ElapsedMilliseconds.ToString) 
    
    Dim fileContents As String 
    
    sw.Reset() 
    sw.Start() 
    For i As Integer = 1 To 100000 
        fileContents = My.Computer.FileSystem.ReadAllText("C:\scratch\Text.txt") 
    Next 
    sw.Stop() 
    Debug.WriteLine("File Read:" + sw.ElapsedMilliseconds.ToString) 
    
+0

同一問題適用於磁盤I/O和網絡I/O(即它的事項還有什麼是飛來飛去),但不會對這些議題禁止建議...我只是想獲得一個大致的瞭解。我不知道註冊表是如何存儲的,也不知道.net如何訪問它。 – SFun28 2011-05-17 14:41:58

+0

感謝您發佈測試! – SFun28 2011-05-17 14:44:19

+0

我碰到這個偶然的同時做研究來回答我是否是否應該保存剛纔已經回答我的問題在文件或註冊表和那些測試結果加密的數據庫連接字符串的問題。 – N0Alias 2012-02-03 02:39:28