偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

淺談注冊表讀取所需要付出的性能代價(jià)

系統(tǒng) 其他OS
如果調(diào)用 RegNotifyChangeKeyValue 函數(shù)的線程退出,則會引發(fā)通知。這意味著你不應(yīng)該從線程池線程調(diào)用該函數(shù),因?yàn)楫?dāng)工作列表空閑并且不再需要它們存在時(shí),系統(tǒng)將銷毀線程池中的線程。

Windows 系統(tǒng)的特色功能,注冊表,是一個(gè)十分方便有用的工具。它可以用來以一種統(tǒng)一和多線程安全的方式來永久性的保存數(shù)據(jù)。如果你將數(shù)據(jù)保存在 HKEY_CURRENT_USER 鍵下,則數(shù)據(jù)可以隨著用戶一起漫游,并且可以保護(hù)單個(gè)鍵值 (即使是在使用了 FAT 文件系統(tǒng)的操作系統(tǒng)也是如此)。

但這并不意味著這是一份免費(fèi)的午餐。

據(jù)我所知,從打開注冊表鍵開始,讀取鍵值并關(guān)閉它,整個(gè)過程將花費(fèi)大約 60000 到 100000 個(gè) CPU 周期,這還是假定要查找的鍵值已經(jīng)緩存在內(nèi)存中的情況。如果你打開注冊表鍵并保持打開狀態(tài),那么讀取值的行為大約需要 15000 到 20000 個(gè) CPU 周期(這些測算數(shù)據(jù)是 Windows XP 下的估計(jì)值,在真實(shí)情況下數(shù)據(jù)可能會有所不同)。

因此,我們不應(yīng)在一個(gè)內(nèi)部循環(huán)中讀取注冊表項(xiàng)。它不僅會在查詢時(shí)花費(fèi) CPU 時(shí)間,而且注冊表的不斷查詢意味著,注冊表用于查找和存儲鍵(包括注冊表緩存中的條目)的數(shù)據(jù)結(jié)構(gòu)將始終保存在系統(tǒng)工作集中。

另外,也不要在每次鼠標(biāo)移動(dòng)時(shí)讀取注冊表項(xiàng),應(yīng)該僅讀取該值一次并緩存結(jié)果。

如果你擔(dān)心用戶在程序運(yùn)行時(shí)修改了鍵值,則可以考慮建立一個(gè)規(guī)則,供人們在想要更改設(shè)置時(shí)遵循。
例如,Windows 使用諸如 SystemParametersInfo 之類的函數(shù),在通常情況下,會首先讀寫緩存中的數(shù)據(jù),而不是每次都從注冊表中讀取。調(diào)用 update 函數(shù)會更新注冊表和內(nèi)存中緩存。

如果無法建立協(xié)調(diào)設(shè)置更改的機(jī)制,則可以通過 RegNotifyChangeKeyValue 函數(shù)設(shè)置更改通知,以便在值更改時(shí)收到通知。一般原則是,應(yīng)該盡可能針對常見情況進(jìn)行優(yōu)化,而不是針對罕見情況進(jìn)行優(yōu)化。常見情況是注冊表值未更改。通過使用通知機(jī)制,可以將“但是如果值更改了怎么辦?”的成本從內(nèi)部循環(huán)中移出,并轉(zhuǎn)移到大多數(shù)時(shí)間不執(zhí)行的代碼中。(請記住,最快的代碼是永遠(yuǎn)不會運(yùn)行的代碼。)

當(dāng)然,你不想在一個(gè)線程上等待多個(gè)通知事件。我的方法是:使用線程池。
RegisterWaitForSingleObject 函數(shù)可以用來告訴線程池,”嘿,當(dāng)這個(gè)對象發(fā)出信號時(shí),請通知我?!?然后,線程池會將其與要求等待的所有其他句柄組合成一個(gè)巨大的 WaitForMultipleObjects 調(diào)用。這樣,一個(gè)線程可以處理多個(gè)等待對象。

需要注意的一個(gè)地方是,RegNotifyChangeKeyValue 函數(shù)所發(fā)出的通知具有線程親緣性。
如果調(diào)用 RegNotifyChangeKeyValue 函數(shù)的線程退出,則會引發(fā)通知。這意味著你不應(yīng)該從線程池線程調(diào)用該函數(shù),因?yàn)楫?dāng)工作列表空閑并且不再需要它們存在時(shí),系統(tǒng)將銷毀線程池中的線程。

如果你不小心搞砸了并從線程池線程調(diào)用它,你會發(fā)現(xiàn)當(dāng)線程池清理代碼運(yùn)行時(shí),事件不斷虛假觸發(fā),這可不是一件好事。

相反,你應(yīng)該從持久線程(例如,實(shí)際關(guān)心值的線程) 創(chuàng)建等待,并在那里注冊等待。當(dāng)事件在線程池上觸發(fā)時(shí),處理更改,然后要求持久線程啟動(dòng) RegNotifyChangeKeyValue 的新周期。這樣,事件始終與持久線程相關(guān)聯(lián),而不是與暫時(shí)性線程池線程相關(guān)聯(lián)。

總結(jié)

一般我們會將應(yīng)用程序的設(shè)置數(shù)據(jù)保存到注冊表,這很方便,但是記得讀取的時(shí)候,盡量只讀一次并緩存結(jié)果,而不是每次都從注冊表里讀取,這對運(yùn)行時(shí)性能是有傷害的。

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2019-04-15 13:32:53

5G機(jī)器人物聯(lián)網(wǎng)

2013-09-29 13:52:31

2011-04-21 09:10:16

2019-04-18 10:42:21

網(wǎng)絡(luò)安全網(wǎng)絡(luò)安全技術(shù)周刊

2011-08-09 17:15:45

注冊表注冊表編輯器

2011-08-04 16:37:09

注冊表編輯器注冊表

2009-08-19 13:25:53

C#操作注冊表

2009-08-19 13:49:14

C#操作注冊表

2011-06-28 10:11:05

Qt Qt 4.1.0 注冊表

2009-08-21 09:43:49

C#編輯注冊表

2011-08-04 16:49:33

注冊表注冊表編輯器

2012-09-13 10:40:30

技術(shù)債務(wù)管理項(xiàng)目管理

2011-03-17 11:24:15

2009-07-07 12:09:04

注冊表開發(fā).NET Compac

2010-10-20 17:14:03

SQL Server管

2020-09-29 09:26:36

Nexus

2009-08-31 14:45:13

C#注冊表

2009-02-18 08:42:40

手動(dòng)備份注冊表

2011-08-04 18:49:50

注冊表注冊表編輯器

2009-06-18 10:41:03

RuntimeVers.NET組件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號