把類的所有資料成員用雜湊表來替換,代價是多少?

2021-05-02 22:39:20 字數 871 閱讀 9382

解釋一下標題先。一般地,訪問物件的某個資料成員都是用「物件名.資料成員名」的形式,但若要動態的決定訪問哪個資料成員,就得使用雜湊表,一種可能的訪問形式是「 物件名.getdatamember("資料成員名")  」,這個很好實現,用乙個雜湊錶類對映,但重點不是怎麼實現,而是這樣的代價有多高?

首先我對普通的資料成員訪問形式做了時間的測試,被測試的是一條賦值語句,等號左邊是乙個區域性變數(實現宣告好的),右邊是乙個物件的資料成員的引用。我沒有簡單地將這條語句用for執行n次,因為可能每一次迴圈"for"的**的執行所占用的時間和那條賦值語句在同乙個數量級上;當然我也不可能把這條語句copy n 份執行,若要copy 100000份,估計我得花上10天時間不停的按ctrl + c / ctrl + v;所以我在for中放置了數百條該語句,為了確保"for"的**的執行時間在一次迴圈中已經很小了,我進行了4次試驗,分別在for中放置了100、200、300、400條該語句,最後發現"for"的**的執行時間確實可以忽略了。就這樣,我測出了平均一條該對普通資料成員訪問所用的時間,大致為0.164e-6毫秒/條(intel core 2 duo t7250 2.00g,2.5g ram ,c#,後同)。

接下來是用雜湊表來間接訪問「資料成員」的測試。一開始,我以為雜湊表的初始容量、實際大小會影響到查詢的時間,於是我分別對這兩個變數進行了對照實驗,結果是都不會有影響,這一點我很納悶。先不管了,測試的結果是0.11e-3毫秒/條。另外隨便補充一點,就是向雜湊表中插入一對「鍵/值」的時間複雜度為o(1),大致為0.115ms。

可見「代價」還是不小的。但是也不能這樣就做下結論說用雜湊表來間接訪問「資料成員」不可取,因為還不知道在你的程式中,訪問資料成員所消耗的時間所佔的比例是不是最大的,也就是說要看這條語句是不是效能的瓶頸,若不是瓶頸,可以考慮為了實現某些功能而犧牲一點效能。

刪除所表的所有資料

在開發的時候往往新增不少的測試資料,在執行指令碼之前需要將原有的資料刪除,而且還會有外來鍵約束,標識列的問題。於是寫了這個自動刪除表的所有資料.1 ifobject id temp clear all data is null 2begin 3declare tablename varchar 50...

類的私有資料成員的訪問

類的私有資料成員智慧型在類體哪被訪問,不能夠在類體外通過物件名直接訪問,考察下面的類 class point1 point1 point1 point1 point1 void point1 setpoint int x,int y,int z void point1 display 執行結果 12...

448 找到所有陣列中消失的數字(雜湊表)

1.問題描述 給定乙個範圍在 1 a i n n 陣列大小 的整型陣列,陣列中的元素一些出現了兩次,另一些只出現一次。找到所有在 1,n 範圍之間沒有出現在陣列中的數字。您能在不使用額外空間且時間複雜度為o n 的情況下完成這個任務嗎?你可以假定返回的陣列不算在額外空間內。示例 輸入 4,3,2,7...