主题:【原创】说说.NET 3.5中的高性能害死集--HashSet -- Highway
这篇文章写得有些仓促。问题叙述本身还没有大碍,但结论部分明摆着有问题。感谢虹道网友的几个问题,使我回过头来又看了一下我的测试程序和帖子。结果顿时冒汗。。。
可能是写帖子的时候喝得有些高了,结论真是非常的草率。Java和.NET在Hash上的性能差距和Generics应该是没有关系的。Boxing, Casting也扯不上。误导大家,实在是不好意思。
本想好好把这个问题搞个清楚,给大家个说法。可是当深究这个问题的时候,发现还是有几个疑点很难一下子弄个水落石出的。并且这些天工作上忙得很,没有多少时间花在这个问题上了。这里再次向大家道个歉。等忙过这阵子了,一点写篇好点的东西,补偿一下。
往简单里说,HashMap,HashSet这些东西的关键是hashcode()和equals()两个函数。一个Object入住HashMap/HashSet的时候是先用自己的hash code找到相应的bucket,然后一个个的比过去(equals call)。这和在电影院对号入座有点像。进门的时候拿一个号,到了里面用这个号先找到是在哪一排,到了这排以后,从头上开始问起“劳驾,这里有人吗?”。直到找到一个空座,这才可以坐下来。这个找排依靠的是Hashcode,找座儿靠的是equals()函数。当一个HashMap,HashSet里面Object很多的情况下,每排就会有很多的人,要反复调用equals函数。这时候equals()函数的效率就成了关键。NET在整数上表现优异我觉得是它的equals()很简单(最简单的整数比较嘛),而Java比的是两个Integer Object,慢一些。两者Hashcode的逻辑是一模一样的。应该没有什么差距。在String操作上,.NET和Java的hashCode()和equals()实现都相差较大。.NET居然有微弱优势,这个倒是我没有想到的。
我这还只是个推论,没有从多个角度用数据证明,抱歉了。
- 相关回复 上下关系8
🙂【原创】说说.NET 3.5中的高性能害死集--HashSet 45 Highway 字7535 2007-09-03 22:31:59
🙂【致歉】Highway向大家道个歉
😄俺这个计算机小白看不懂也送花 马鹿 字0 2007-09-05 22:21:19
🙂JAVA 和.NET 再整数上的速度差有没有可能是heap 的 1 虹道 字150 2007-09-05 21:51:35
😉Good Question。为了回答你这个问题, 1 Highway 字1556 2007-09-05 22:36:19
🙂如果把HashMap的起始容量加大 虹道 字47 2007-09-08 15:15:50
🙂很有道理 tkvn 字457 2007-09-06 09:00:25
🙂C#不需要collect garbage么? 请尽量 字0 2007-09-05 22:34:18