值類型和引用類型在hashtable里面性能比較分析1 -GetHashCode()
上篇文章中,測試了一下值類型數據和引用類型數據在hashtable中插入和讀取的性能,測試結果和本人預期也有一些出入,msdn有一篇文章介紹在box,unbox的時候,性能關系為:class>interface>int,原文:Open the Box! Quick,進一步分析了上篇測試,發現其實影響測試性能還有其它幾個方面的因素,本篇就針對不同數據類型在GetHashCode()上面的消耗
測試程序如下;
結果表,我暫且不畫在這上面了,因為比較多,而且不好排版,我只說一下結果,int類型的數據比字符串類型的在GetHashCode()的效率上要高50多倍,比Class的也高50-70倍
察看了GetHashCode()的實現
Int32
而object的實現方法,我 不太理解:
測試程序如下;
1
System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
2
stopWatch.Start();
3
for (int i = 0; i < CompareCount; i++)
4
{
5
int hashCode = i.GetHashCode();
6
}
7
stopWatch.Stop();
8
System.Diagnostics.Stopwatch stopWatch2 = new System.Diagnostics.Stopwatch();
9
stopWatch2.Start();
10
for (int i = 0; i < CompareCount; i++)
11
{
12
int hashCode = i.ToString().GetHashCode();
13
}
14
stopWatch2.Stop();
15
System.Diagnostics.Stopwatch stopWatch3 = new System.Diagnostics.Stopwatch();
16
stopWatch3.Start();
17
for (int i = 0; i < CompareCount; i++)
18
{
19
int hashCode = new Test().GetHashCode();
20
}
21
stopWatch3.Stop();
22
long t1 = stopWatch.ElapsedTicks;
23
long t2 = stopWatch2.ElapsedTicks;
24
long t3 = stopWatch3.ElapsedTicks;
25
Console.WriteLine(t1.ToString());
26
Console.WriteLine(t2.ToString());
27
Console.WriteLine(t3.ToString());
28
Console.WriteLine((double)(t2/t1));
29
ArrayList list = new ArrayList();
30
}
System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();2
stopWatch.Start();3
for (int i = 0; i < CompareCount; i++)4
{5
int hashCode = i.GetHashCode();6
}7
stopWatch.Stop();8
System.Diagnostics.Stopwatch stopWatch2 = new System.Diagnostics.Stopwatch();9
stopWatch2.Start();10
for (int i = 0; i < CompareCount; i++)11
{12
int hashCode = i.ToString().GetHashCode();13
}14
stopWatch2.Stop();15
System.Diagnostics.Stopwatch stopWatch3 = new System.Diagnostics.Stopwatch();16
stopWatch3.Start();17
for (int i = 0; i < CompareCount; i++)18
{19
int hashCode = new Test().GetHashCode();20
}21
stopWatch3.Stop();22
long t1 = stopWatch.ElapsedTicks;23
long t2 = stopWatch2.ElapsedTicks;24
long t3 = stopWatch3.ElapsedTicks;25
Console.WriteLine(t1.ToString());26
Console.WriteLine(t2.ToString());27
Console.WriteLine(t3.ToString());28
Console.WriteLine((double)(t2/t1));29
ArrayList list = new ArrayList();30
}結果表,我暫且不畫在這上面了,因為比較多,而且不好排版,我只說一下結果,int類型的數據比字符串類型的在GetHashCode()的效率上要高50多倍,比Class的也高50-70倍
察看了GetHashCode()的實現
Int32
1
public override int GetHashCode()
2
{
3
return this;
4
}
5
6
public override int GetHashCode()2
{3
return this;4
}5

6

String
1
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
2
public override unsafe int GetHashCode()
3
{
4
fixed (char* text1 = ((char*) this))
5
{
6
char* chPtr1 = text1;
7
int num1 = 0x15051505;
8
int num2 = num1;
9
int* numPtr1 = (int*) chPtr1;
10
for (int num3 = this.Length; num3 > 0; num3 -= 4)
11
{
12
num1 = (((num1 << 5) + num1) + (num1 >> 0x1b)) ^ numPtr1[0];
13
if (num3 <= 2)
14
{
15
break;
16
}
17
num2 = (((num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr1[1];
18
numPtr1 += 2;
19
}
20
return (num1 + (num2 * 0x5d588b65));
21
}
22
}
23
24
25
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]2
public override unsafe int GetHashCode()3
{4
fixed (char* text1 = ((char*) this))5
{6
char* chPtr1 = text1;7
int num1 = 0x15051505;8
int num2 = num1;9
int* numPtr1 = (int*) chPtr1;10
for (int num3 = this.Length; num3 > 0; num3 -= 4)11
{12
num1 = (((num1 << 5) + num1) + (num1 >> 0x1b)) ^ numPtr1[0];13
if (num3 <= 2)14
{15
break;16
}17
num2 = (((num2 << 5) + num2) + (num2 >> 0x1b)) ^ numPtr1[1];18
numPtr1 += 2;19
}20
return (num1 + (num2 * 0x5d588b65));21
}22
}23

24
25

而object的實現方法,我 不太理解:
1
public virtual int GetHashCode()
2
{
3
return object.InternalGetHashCode(this);
4
}
5
6
7
[MethodImpl(MethodImplOptions.InternalCall)]
8
internal static extern int InternalGetHashCode(object obj);
9
public virtual int GetHashCode()2
{3
return object.InternalGetHashCode(this);4
}5

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

object的具體處理方法
而從int,string類型算法可以輕易看出效率差別,雖然string類型還有unsafe .
而且,值類型必須重寫GetHashCode。
從這里可以看出,在上次測試中,GetHashCode幫了int類型不少忙呀!
作者:jillzhang
出處:http://jillzhang.cnblogs.com/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
出處:http://jillzhang.cnblogs.com/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


浙公網安備 33010602011771號