簡體   English   中英

占用更少的空間,UInt64或C#中的字符串

[英]Which consumes less space, UInt64 or a string in C#

在C#中最好的主意是什么,

  1. 在C#中,我正在使用字典。 我希望它使用更少的內存空間。 有什么會更好?

    關鍵字類型為Uint64或關鍵字類型為string的字典? 在這兩種情況下,該值都是一個自定義類,每個字典都相同。

    我已經聲明了以下字典,

     private static readonly Dictionary<string, List<Node>> HashTable = new Dictionary<string, List<Node>>(); 

    類節點定義如下

     public class Node { public UInt64 CurrentIndex { get; set; } public string NextHashedString { get; set; } public int NextHashPos { get; set; } } 

    字符串的鍵實際上是來自字符串的哈希值,其計算如下:字符串的長度可以是1到20個字符。

     static UInt64 CalculateHash(string read, bool lowTolerance) { UInt64 hashedValue = 0; int i = 0; while (i < read.Length) { hashedValue += read.ElementAt(i) * (UInt64)Math.Pow(31, i); if (lowTolerance) i += 2; else i++; } return hashedValue; } 

    現在,我想將此哈希值存儲為字典的鍵。 最好的主意是什么。 我用作Uint64或將其轉換為字符串並將字符串用作字典鍵。 我的主要目標是字典使用最少的空間,並且鍵的搜索時間更快。

  2. 我有一個包含3571079個字符的文件。 我可以將整個文件讀成字符串還是需要高級數據結構?

使用UInt64代替字符串(或任何其他引用類型)作為字典的鍵實際上會消耗較少的內存。 使用類似字符串的引用類型需要字典將鍵的引用存儲在其內部數據結構中,這也會導致被引用的對象(字符串)也保留在內存中,包括每個對象的開銷等。是UInt64,(當前的實現)字典存儲鍵的值,而不是對鍵的引用(作為泛型工作原理的一部分),而沒有任何單獨的鍵對象。

我只能想到一種情況,UInt64密鑰比字符串可能會導致更高的內存使用率:如果進程是32位(x86),則引用是32位。 如果字典很大,但幾乎為空,則將有許多空的Dictionary<K,V>.Entry實例。 對於UInt64鍵,這些實例的鍵部分將是64位(即使未分配任何顯式值),而對於字符串鍵,則只有32位。 因此,使用UInt64鍵的字典分配的內存總量將更多。 但這是一個非常理論上的情況。

因此,如果您可以使用UInt64鍵而不是字符串而不犧牲軟件設計的其他質量 ,那么使用它們就沒有錯。 但是在真正必要之前不要開始進行優化。 用Donald Knuth的話來說:“過早的優化是萬惡之源”

更新:更新您的帖子以顯示如何計算UInt64值時:

  1. 如果您只是通過在UInt64值上調用ToString來簡單地得出字符串鍵,則應該首先使用UInt64版本。 一定會更有效率。

  2. 使用哈希作為鍵可能有些棘手。 您需要確保哈希不會沖突。 乍看之下,您的哈希函數看起來並不是特別好,但這當然取決於您的用例。 但這超出了我想這個問題的范圍。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM