惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
Security Latest
Security Latest
Simon Willison's Weblog
Simon Willison's Weblog
O
OpenAI News
GbyAI
GbyAI
L
LINUX DO - 最新话题
A
Arctic Wolf
T
Tor Project blog
G
GRAHAM CLULEY
I
InfoQ
博客园_首页
IT之家
IT之家
The Register - Security
The Register - Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Proofpoint News Feed
The GitHub Blog
The GitHub Blog
Blog — PlanetScale
Blog — PlanetScale
N
Netflix TechBlog - Medium
K
Kaspersky official blog
博客园 - 三生石上(FineUI控件)
S
SegmentFault 最新的问题
U
Unit 42
PCI Perspectives
PCI Perspectives
量子位
P
Palo Alto Networks Blog
S
Securelist
T
Troy Hunt's Blog
博客园 - 【当耐特】
Recorded Future
Recorded Future
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
Security Affairs
Engineering at Meta
Engineering at Meta
T
The Blog of Author Tim Ferriss
博客园 - 聂微东
罗磊的独立博客
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
B
Blog RSS Feed
NISL@THU
NISL@THU
C
Cisco Blogs
T
Threatpost
有赞技术团队
有赞技术团队
Forbes - Security
Forbes - Security
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
T
The Exploit Database - CXSecurity.com
Cloudbric
Cloudbric
Cyberwarzone
Cyberwarzone
Google DeepMind News
Google DeepMind News
C
Cyber Attacks, Cyber Crime and Cyber Security

博客园 - Cavingdeep

用metaclass实现AOP风格的Profiler Singleton implementation using metaclass 初试IronPython与.NET的集成 Refactoring as a way to improve the existing design 用metaclass来实现AOP 不该用Generics实现Abstract Factory的理由 新兴XML处理方法VTD-XML介绍 Performance Tips I DCG 2.0.72 (Beta1) 发布了 NUnit发布2.2.3兼容.NET 2.0 RTM 如果你想拥有一个可嵌入式模板引擎…… 改进ASP语法打造更高效的模板语言II 改进ASP语法打造更高效的模板语言 XML的特征以及一些用途 Release of DbHelper 1.2.1 深入XML系列技术 DbHelper at Tigris SQLite系列 DbHelper basic usage
集合的初始容量与性能
Cavingdeep · 2005-10-15 · via 博客园 - Cavingdeep

没事随便写写 :)

你知道当你写下下面这两句时这些数据结构的实际长度吗?

ArrayList list = new ArrayList();

Hashtable table 
= new Hastable();

你知道初始容量对今后的操作有什么性能上的影响吗?如果你不知道,让我来告诉你,因为我研究过了。

ArrayList与List<T>

  • .NET Framework 1.x中的ArrayList默认初始容量为16。今后当容量不够时,内部数组的长度会乘以2。
  • .NET Framework 2.0中的List<T>默认初始容量为4,但是实例后是0,因为它是lazy initialization,当你第一次调用Add或相关方法时才会初始为长度4。今后当容量不够时,内部数组的长度会乘以2。

也就是说,容量越大,需要resize的次数越少,性能也就越高,占用的空间也相对的大。建议你用平均数据量来设置初始容量。所谓平均数据量指在一次一般性操作中会有多少数据插入进list。

Hashtable与Dictionary<K, V>

  • .NET Framework 1.x中的Hashtable默认初始容量为7,实际为长度11。如果你对Hashtable不了解的话可能会问:“初始为7实际为11?!什么意思?”说来话长,简单地说,就是为了性能,我们插入进Hashtable的元素数量永远都只有它内部数组长度的一部分,至于这一部分到底是多少,是由它的load factor来决定的。这个load factor默认为0.72,是微软找出的最佳百分比,建议采用。所以默认容量为7但实际上数组长度为11(0.72 * 11)。当今后容量不够时,也就是当元素数量要大于等于容量时(默认的话也就是第一次要大于等于7时),Hashtable的内部数组会乘以2后找出相邻的更大质数作为新的容量(注意11是最小的质数容量)。
  • .NET Framework 2.0中的Dictionary<K, V>默认初始容量为3,同List<T>一样,是lazy initialization。因为与Hashtable实现不同,所以没有load factor这个概念。当今后容量不够时,内部的数组长度会乘以2后找出相邻的更大质数作为新的容量(注意3是最小的质数容量)。

同样,容量越大,需要resize的次数越小,性能也就越高,占用的空间也相对的大。像Hashtable与Dictionary这种map型的数据结构与list这种结构不同,resize需要做的事情比较多,也就是性能消耗要比list的高,所以初始容量通常设的大一点会比较好。

Dictionary<K, V>因为在处理Collision上要比Hashtable的高明,所以在检索性能上要比Hashtable高,建议在.NET 2.0下使用。