值类型和引用类型在hashtable里面性能比较分析1 -GetHashCode()

上篇文章中,测试了一下值类型数据和引用类型数据在hashtable中插入和读取的性能,测试结果和本人预期也有一些出入,msdn有一篇文章介绍在box,unbox的时候,性能关系为:class>interface>int,原文: Open the Box! Quick,进一步分析了上篇测试,发现其实影响测试性能还有其它几个方面的因素,本篇就针对不同数据类型在GetHashCode()上面的消耗
测试程序如下;
 1 None.gif  System.Diagnostics.Stopwatch stopWatch  =   new  System.Diagnostics.Stopwatch();
 2 None.gif            stopWatch.Start();
 3 None.gif             for  ( int  i  =   0 ; i  <  CompareCount; i ++ )
 4 ExpandedBlockStart.gifContractedBlock.gif             dot.gif {
 5InBlock.gif                int hashCode = i.GetHashCode();
 6ExpandedBlockEnd.gif            }

 7 None.gif            stopWatch.Stop();
 8 None.gif            System.Diagnostics.Stopwatch stopWatch2  =   new  System.Diagnostics.Stopwatch();
 9 None.gif            stopWatch2.Start();
10 None.gif             for  ( int  i  =   0 ; i  <  CompareCount; i ++ )
11 ExpandedBlockStart.gifContractedBlock.gif             dot.gif {
12InBlock.gif                int hashCode = i.ToString().GetHashCode();
13ExpandedBlockEnd.gif            }

14 None.gif            stopWatch2.Stop();
15 None.gif            System.Diagnostics.Stopwatch stopWatch3  =   new  System.Diagnostics.Stopwatch();
16 None.gif            stopWatch3.Start();
17 None.gif             for  ( int  i  =   0 ; i  <  CompareCount; i ++ )
18 ExpandedBlockStart.gifContractedBlock.gif             dot.gif {
19InBlock.gif                int hashCode = new Test().GetHashCode();
20ExpandedBlockEnd.gif            }

21 None.gif            stopWatch3.Stop();
22 None.gif             long  t1  =  stopWatch.ElapsedTicks;
23 None.gif             long  t2  =  stopWatch2.ElapsedTicks;
24 None.gif             long  t3  =  stopWatch3.ElapsedTicks;
25 None.gif            Console.WriteLine(t1.ToString());
26 None.gif            Console.WriteLine(t2.ToString());
27 None.gif            Console.WriteLine(t3.ToString());
28 None.gif            Console.WriteLine(( double )(t2 / t1));
29 None.gif            ArrayList list  =   new  ArrayList();
30 None.gif        }

结果表,我暂且不画在这上面了,因为比较多,而且不好排版,我只说一下结果,int类型的数据比字符串类型的在GetHashCode()的效率上要高50多倍,比Class的也高50-70倍
察看了GetHashCode()的实现
Int32
     
1 None.gif public   override   int  GetHashCode()
2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
3InBlock.gif      return this;
4ExpandedBlockEnd.gif}

5 None.gif
6 None.gif

String

 1 None.gif [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
 2 None.gif public   override   unsafe   int  GetHashCode()
 3 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 4InBlock.gif      fixed (char* text1 = ((char*this))
 5ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
 6InBlock.gif            char* chPtr1 = text1;
 7InBlock.gif            int num1 = 0x15051505;
 8InBlock.gif            int num2 = num1;
 9InBlock.gif            int* numPtr1 = (int*) chPtr1;
10InBlock.gif            for (int num3 = this.Length; num3 > 0; num3 -= 4)
11ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
12InBlock.gif                  num1 = (((num1 << 5+ num1) + (num1 >> 0x1b)) ^ numPtr1[0];
13InBlock.gif                  if (num3 <= 2)
14ExpandedSubBlockStart.gifContractedSubBlock.gif                  dot.gif{
15InBlock.gif                        break;
16ExpandedSubBlockEnd.gif                  }

17InBlock.gif                  num2 = (((num2 << 5+ num2) + (num2 >> 0x1b)) ^ numPtr1[1];
18InBlock.gif                  numPtr1 += 2;
19ExpandedSubBlockEnd.gif            }

20InBlock.gif            return (num1 + (num2 * 0x5d588b65));
21ExpandedSubBlockEnd.gif      }

22ExpandedBlockEnd.gif}

23 None.gif
24 None.gif 
25 None.gif

而object的实现方法,我 不太理解:
1 None.gif public   virtual   int  GetHashCode()
2 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
3InBlock.gif      return object.InternalGetHashCode(this);
4ExpandedBlockEnd.gif}

5 None.gif
6 None.gif 
7 None.gif[MethodImpl(MethodImplOptions.InternalCall)]
8 None.gif internal   static   extern   int  InternalGetHashCode( object  obj);
9 None.gif

 object的具体处理方法
而从int,string类型算法可以轻易看出效率差别,虽然string类型还有unsafe .

而且,值类型必须重写GetHashCode。
从这里可以看出,在上次测试中,GetHashCode帮了int类型不少忙呀!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值