Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.Net 2.0-通用列表的效率如何?_.net_Performance_Generics_List_Memory - Fatal编程技术网

.Net 2.0-通用列表的效率如何?

.Net 2.0-通用列表的效率如何?,.net,performance,generics,list,memory,.net,Performance,Generics,List,Memory,我正在创建一个在内存中保存大量用户数据的应用程序,它主要将所有数据保存在列表结构中(当我需要查找时,还会保存一些字典) 我想知道 列表的效率如何? 每一个都有多少内存开销?(也就是说,除了它们包含的对象将占用的内存空间) 每次我申请一个新的,我要付多少罚金 有没有更有效的方法 字典只是哈希表,对吗?或者它们是一种效率较低的数据结构 我想使用数组,但我有一个典型的问题,就是一直在添加和删除数组中的内容,因此必须增加/缩小数组将是一件痛苦的事情 有什么想法/建议吗 编辑:我知道我的基本数据结构10

我正在创建一个在内存中保存大量用户数据的应用程序,它主要将所有数据保存在列表结构中(当我需要查找时,还会保存一些字典)

我想知道

列表的效率如何? 每一个都有多少内存开销?(也就是说,除了它们包含的对象将占用的内存空间) 每次我申请一个新的,我要付多少罚金

有没有更有效的方法

字典只是哈希表,对吗?或者它们是一种效率较低的数据结构

我想使用数组,但我有一个典型的问题,就是一直在添加和删除数组中的内容,因此必须增加/缩小数组将是一件痛苦的事情

有什么想法/建议吗


编辑:我知道我的基本数据结构101,以及为什么链表更适合添加/删除,而哈希表更适合随机访问

我最关心的是.Net的白痴统治。例如,每个结构浪费了多少内存。以及在初始化/杀死它们上浪费的时间

例如,如果实例化/GC一个列表需要很多时间,但清除它的时间不多,也许我应该保留一个列表池等待我,清除它们并在完成后将它们发送回池中,而不是简单地取消引用它们

或者,如果哈希表的访问速度更快,但浪费了大量内存,我可能更喜欢使用列表并遍历它们,以进行小项目计数

我还想关注内存使用情况,因为我的应用程序非常占用内存(想想memcached吧)。。。
有人知道我在哪里可以找到这样的信息吗?

列表下面是数组,因此添加项目的性能影响将非常昂贵,除非在最后添加


否则,它们基本上和数组一样快。

列表在内部使用数组,而字典使用哈希表


它们比较旧的非泛型类ArrayList和HashTable更快,因为您不需要将所有内容转换为对象(装箱、取消装箱和类型检查)而且因为MS优化了它们,那么旧的类。

< P>也许你应该考虑使用内存数据库中的一些类型,如果你有很多数据必须保存在内存中,

如果你需要在列表中随机插入或删除列表中的效率,那么就有一个链接表数据结构——给出细节。显然,作为链表随机访问是没有效率的。

由于链表的性质,LinkedList对象的添加和删除时间会减少。添加元素时,它不必像普通列表那样调整数组的大小。除此之外,我怀疑LinkedList的性能与普通列表大致相同


请参见Wikipedia:

如果您关心内存使用,真正的关键是将阵列存储在磁盘上,并将当时需要的部分映射到内存中


关键是要使用文件标志缓冲,并且总是准确地读/写一个扇区的数据。

Net列表不使用链接列表。这是一个数组,默认情况下它以4个位置开始,我认为当你添加东西时,它的大小会加倍。因此,性能可能会有所不同,这取决于您如何使用它



如果您使用VS2008,请在深入这个老鼠洞之前运行探查器。当我们开始真正研究我们在哪里浪费了时间时,我们很快就发现讨论链表的更好的方面其实并不重要

我认为这两个过程可能有些过分;另外,进程间的通信可能会有一些缓慢(尽管我从未尝试过这样的事情,所以把我的观点看作是一派胡言)。我在一个数据驱动的应用程序中工作,其中每个数据单元都很小,但在任何给定的时间,我们可能拥有超过10亿个数据单元。我们使用的方法基本上是:

  • 无论发生什么情况,所有内容都驻留在磁盘上
  • 数据被分为“块”;每个区块都知道上次访问它的时间
  • 块在需要时从磁盘拖到内存中
  • 低优先级线程监视内存使用情况并删除最近使用最少的内容
换句话说,这是一个自制的缓存方案。好处是您可以精确地控制内存中的数据,而如果依赖操作系统分页方案,则无法精确控制内存中的数据。如果某个常用变量最终与页面上的数据混合在一起,该页面将被反复点击,并阻止其进入磁盘。如果您在应用程序中设计了一种调节机制,使某些数据请求比其他请求需要更长的时间,那么这将非常有效。特别是如果你提前知道你需要什么块(我们不知道)

请记住,.NET应用程序中的所有内容都必须在2GB内存范围内,而且由于GC的工作方式和应用程序的开销,您实际使用的内存可能会比2GB内存少一些


要精确监视堆的外观和分配对象,请使用CLR探查器:

如果您确实想查看列表和字典实现方式的所有详细信息,请使用非常有用的


另请参阅文档中的“卓越”,它对BCL中缺少的许多集合类型都有非常好的实现。

除非出现性能问题,并且探查器向您显示确实存在问题,否则我不会动任何手指。然后你会有一个确定的问题要解决,这会容易得多。

为什么在你最初发布这个主题两年多后,现在又重新开始这个主题?请注意,通过编辑它,您可以将其带到头版。除非你想重新对你的问题产生兴趣,否则就让它保持原样,留下它的缺点和一切。你在想什么样的内存数据库?数据集?我的理解是他们的速度非常慢。。。还是你认为我