关于hashtable的小问题

hwbox 2010-07-01 09:05:57
最近用hashtable时发现,C#中的hashtable中的key值和value值都是object的,不知道能否强制为是值类型的?如果不能的话是不是会大大降低效率?另外如果不设最大值的话,hashtale加几十万条会出现什么情况?在十万级的hashtale中取值的话。假设我做一个windows服务提供这个hashtale的检索服务。普通的pcserver大约能检索几次。另外,大数量级的检索是用两级hashtable好还是在一个大hashtable中检索来的快?

请各位高手不吝赐教。分不多见谅。
...全文
210 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianuMan 2010-07-02
  • 打赏
  • 举报
回复
最近用hashtable时发现,C#中的hashtable中的key值和value值都是object的,不知道能否强制为是值类型的?如果不能的话是不是会大大降低效率?另外如果不设最大值的话,hashtale加几十万条会出现什么情况?在十万级的hashtale中取值的话。假设我做一个windows服务提供这个hashtale的检索服务。普通的pcserver大约能检索几次。另外,大数量级的检索是用两级hashtable好还是在一个大hashtable中检索来的快?

不能强制为值类型 hashtable 键和值都是object 操作的时候会发生装箱拆箱
如果键和值都是单一类型 你可以考虑使用 Dictoinary
huminghua 2010-07-02
  • 打赏
  • 举报
回复
10万条居中吧!呵呵!也不算大也不小!嘿嘿!
宇峰科技 2010-07-02
  • 打赏
  • 举报
回复
不知道能否强制为是值类型的?可以啊,你把值类型转为object就OK了
hwbox 2010-07-02
  • 打赏
  • 举报
回复
我也当回实验党以下是测试结果,一百万条纪录的添加和检索测试。结果是dictionary性能最好。
看了有介绍说hashtable是派生自dictionary。看int型的测试结果,可以感觉hashtable的拆装箱费时不少。现在有点想用dictionary了,可它好象不是线程安全的。不知道那位高人能帮咱做个dictionary的Synchronized包装方法,或者介绍下实现过程,要是让咱自己加锁可有点过时啊。

==============================================

当key value都是int的时候

hashtable(默认因子)
添加 1~1000000 256ms
查key 1~1000000 359ms

dictionary
添加 1~1000000 81ms
查key 1~1000000 24ms

sortedDictionary
添加 1~1000000 747ms
查key 1~1000000 576ms

当key vlaue都是string的时候

hashtable(默认因子)
添加 1~1000000 1460ms
查key 1~1000000 1798ms

dictionary
添加 1~1000000 938ms
查key 1~1000000 324ms

sortedDictionary
添加 1~1000000 5598ms
查key 1~1000000 3361ms
hwbox 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuyq11 的回复:]
多线程使用时,如果任何一个线程执行写入操作,都不是线程安全的。若要支持多个编写器,没有任何线程在读取 Hashtable 对象,则对 Hashtable 的所有操作都必须通过 Synchronized 方法返回的包装完成。
[/Quote]

我就是用的这个Synchronized自同步包装,但看到有文档上介绍说在进行多线程添加时还是会出错,那个作者建议多线程添加时要加锁。

不知道Dictionary、SortedDictionary、SortedList这几个支不支持自同步包装。另外hashtable中的检索的Hash具有O(1)的效率好象是几个中最高的。不知道SortedDictionary的效率是如何的,我在内存中存入的表数据不会超100万条,都是简单的string型,所以不太用在意内存消耗。但对插入操作还是有一定的效率要求的。
hwbox 2010-07-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 blogtjf 的回复:]
不知道能否强制为是值类型的?可以啊,你把值类型转为object就OK了
[/Quote]

那就是要装箱拆箱了?太影响效率了,还不如直接用呢。
wuyq11 2010-07-01
  • 打赏
  • 举报
回复
多线程使用时,如果任何一个线程执行写入操作,都不是线程安全的。若要支持多个编写器,没有任何线程在读取 Hashtable 对象,则对 Hashtable 的所有操作都必须通过 Synchronized 方法返回的包装完成。
hwbox 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]
Hashtable 是线程安全的,可由多个读取器线程或一个写入线程使用
数据量不大Dictionary、SortedDictionary、SortedList在搜索上都差不多
如果数据量非常大,应该使用SortedDictionary
[/Quote]

Hashtable、Dictionary、SortedDictionary、SortedList另外问一下。除Hashtable外,其它几个是线程安全的吗,我没有太用过。
hwbox 2010-07-01
  • 打赏
  • 举报
回复
[Quote=引用楼主 hwbox 的回复:]
最近用hashtable时发现,C#中的hashtable中的key值和value值都是object的,不知道能否强制为是值类型的?如果不能的话是不是会大大降低效率?另外如果不设最大值的话,hashtale加几十万条会出现什么情况?在十万级的hashtale中取值的话。假设我做一个windows服务提供这个hashtale的检索服务。普通的pcserver大约能检索几次。另外,大数量级的检索是用两……
[/Quote]

就是要使用多线程,所以用hashtable另外写线程也是多个,我可以用自同步hashtable保证删改,添加的话,还是要加锁。十万条记录算大还是小?
wuyq11 2010-07-01
  • 打赏
  • 举报
回复
Hashtable 是线程安全的,可由多个读取器线程或一个写入线程使用
数据量不大Dictionary、SortedDictionary、SortedList在搜索上都差不多
如果数据量非常大,应该使用SortedDictionary

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧