结构类型需要重载GetHashCode和Equals

我比较迟钝,到现在才知道结构类型放在字典作为键时,效率是不好的,最好重载GetHashCode和Equals,那效率究竟差异有多大呢?我写了一个测试程序。

 

ResourceServiceKey2 key1 = new ResourceServiceKey2(typeof(IRegisterAssemblyService),"OrderSheet"); 
           ResourceServiceKey2 key2 
= new ResourceServiceKey2(typeof(IRegisterAssemblyService), "OrderSheet"); 
           DateTime begin 
= DateTime.Now;
           DateTime endTime;           
bool r;
           
for (int i = 0; i < 10000000; i++{               r = key1.Equals(key2);
           }
           endTime = DateTime.Now;
           TimeSpan s 
= begin - endTime;
           ResourceServiceKey key3 
= new ResourceServiceKey(typeof(IRegisterAssemblyService), "OrderSheet");
           ResourceServiceKey key4 
= new ResourceServiceKey(typeof(IRegisterAssemblyService), "OrderSheet");
           begin 
= DateTime.Now;
           
for (int i = 0; i < 10000000; i++{               r = key3.Equals(key4);
           }

           endTime 
= DateTime.Now; 
          TimeSpan s2 
= begin - endTime; 


ResourceServiceKey是重载了这两个方法的,共花了0.5秒左右,而ResourceServiceKey2没有重载,共花了22秒,差异还是挺大的。反编译ValueType(结构的基础类型),看了代码,才发现,这样不慢才怪呢。

public override bool Equals(object obj) 

if (obj == null

return false
}
 
RuntimeType type1 
= (RuntimeType) base.GetType(); 
RuntimeType type2 
= (RuntimeType) obj.GetType(); 
if (type2 != type1) 

return false
}
 
object obj1 = this
if (ValueType.CanCompareBits(this)) 

return ValueType.FastEqualsCheck(obj1, obj); 
}
 
FieldInfo[] infoArray1 
= type1.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); 
for (int num1 = 0; num1 < infoArray1.Length; num1++

object obj2 = ((RtFieldInfo) infoArray1[num1]).InternalGetValue(obj1, false); 
object obj3 = ((RtFieldInfo) infoArray1[num1]).InternalGetValue(obj, false); 
if (obj2 == null

if (obj3 != null

return false
}
 
}
 
else if (!obj2.Equals(obj3)) 

return false
}
 
}
 
return true
}
 

 

posted @ 2006-12-12 09:35 编写人生 阅读(120) 评论(1)  编辑 收藏 网摘

我的搜索引擎继7月份第二次开放测试后,现在进行第三次开放测试,前

两次分别用CGI+Html、Java做的客户端网站,这次学习了4个月 .NET,

用.NET做了一个版本,请大家多批评指正。同时开放网站源代码。
无为搜索引擎开始测试了啊
(第三次开放测试啊) 网站运行后的效果请参见:
http://219.233.38.213/Search/WuWei.aspx">http://219.233.38.213/Search/WuWei.aspx
最新代码下载地址 :http://soft.e531.com/soft/se.rar">http://soft.e531.com/soft/se.rar
前两次用 CGI+html做了一个版本还做了一个 Java版本 (这次比较忙,

所以没来的及更新,有需要的跟我说一声啊)
这次用 C# ASP.NET做一个 玩玩
做的不好,请大家做指教啊!
这次还实现了计算器功能啊
可以搜索一下 sin(1+2) 看看
另外 sh=1&sf=1&ua=1&sa=1&st=1&wh=1&ph=1 把这里面的 1改成 0

看看 每个部分都是可以控制的:)
至于为什么要把客户端网站部分开源,请参考我第二次开放测试时即兴

写的文章 : 最近我研究搜索引擎 七 (长长中国人的志气篇)
http://www.baidu.com/s?wd=%D7%EE%BD%FC%CE%D2%D1%D0%BE%BF%CB%

D1%CB%F7%D2%FD%C7%E6%C6%DF&cl=3
承盟广大网友看的起 该文目前已经被全国 2000多网站转载
先说一下技术指标: 本次我收录了全国30多万个一、二级域名, 网页

采集用了三周时间,目前已经采集了 12万网站,平均每个网站收录 30

篇网页,索引进行了 10天,
目前已经索引了 100多万网页 。 搜索核心部分采用这次采用 C 语言

开发。 客户端提供三个版本一个CGI+HTML版本,一个 Java版本,一个

ASP.NET版本。

代码下载地址 :http://soft.e531.com/soft/se.rar">http://soft.e531.com/soft/se.rar
搜索网站客户端(.NET版本)整体解决方案(源代码)
(第三次开放测试啊) 网站运行后的效果请参见:
http://219.233.38.213/Search/WuWei.aspx">http://219.233.38.213/Search/WuWei.aspx
更多研究讨论请参见我在 baidu的Blog

http://hi.baidu.com/earthsearch

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-12-12 12:39 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: