繁体   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