ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 性能相差7千倍的ToString方法 (转)

性能相差7千倍的ToString方法 (转)

原创 Linux操作系统 作者:iDotNetSpace 时间:2010-09-19 14:03:57 0 删除 编辑
 ToString方法大概是.Net时被用得最多的方法了,所有类型都,引用的,值的,都传承了这个从祖先Object开始的光荣传统。调用一次ToString,相当于惊堂木“啪”一下,大喝“堂下案犯报上名来”,这家伙就全招了。

  可是写程序如查案,形形色色的人都有,对于些记性差,反应迟钝的家伙,就没那么顺利了。梅(枚)举人就是其中之一,来审问下看看:

01 static void testEnumToString()
02 {
03     var day = DayOfWeek.Wednesday;
04     string value = null;
05     for (int i = 0; i < 1000000; i++)
06     {
07         value = day.ToString();
08     }
09     Console.WriteLine(value);
10 }

  整理下结果:

 次数

 1

 2

 3

 4

 时间(ms)

 7135

 7009

 7174

 7010

  看上去没什么,不过根据本府以往的断案经验,其中似有猫腻。本着勿枉勿纵,对人民负责的态度,不怕麻烦,另寻突破口:

01 static void testEnumToString2()
02  {
03      var day = DayOfWeek.Wednesday;
04      string value = null;
05      for (int i = 0; i < 1000000; i++)
06      {
07          switch (day)
08          {
09              case DayOfWeek.Friday:
10                  value = "Friday";
11                  break;
12              case DayOfWeek.Monday:
13                  value = "Monday";
14                  break;
15              case DayOfWeek.Saturday:
16                  value = "Saturday";
17                  break;
18              case DayOfWeek.Sunday:
19                  value = "Sunday";
20                  break;
21              case DayOfWeek.Thursday:
22                  value = "Thursday";
23                  break;
24              case DayOfWeek.Tuesday:
25                  value = "Tuesday";
26                  break;
27              case DayOfWeek.Wednesday:
28                  value = "Wednesday";
29                  break;
30              default:
31                  break;
32          }
33      }
34      Console.WriteLine(value);
35  }

  呈堂证供一上,满堂皆惊:

 次数

 1

 2

 3

 4

 时间(ms)

 2

 1

 1

 1

  我大怒,“大胆狂徒,还不从实招来,不然休怪本府大刑伺候”,梅举人哪见这阵势,浑身哆嗦,头拄地跪着,一会儿没了声息,衙役拖起一看,竟吓晕过去了。

  “大人,是否冷水浇醒用刑”,我想,看案犯这德性,也挨不住几板子,说“先到案犯家里,搜查证据”。能干的捕头Reflector领命,一下子找到了线索:

01 public override string ToString()
02 {
03     return InternalFormat((RuntimeType) base.GetType(), this.GetValue());
04 }
05   
06 private static string InternalFormat(RuntimeType eT, object value)
07 {
08     if (eT.IsDefined(typeof(FlagsAttribute), false))
09     {
10         return InternalFlagsFormat(eT, value);
11     }
12     string name = GetName(eT, value);
13     if (name == null)
14     {
15         return value.ToString();
16     }
17     return name;
18 }

  果然不出所料,案犯肆无忌惮地用了反射,至此案件真相大体明了。如IsDefined和GetName两处,深究下去,触目惊心,令人发指。

  可惜天下人,有多少还被蒙在鼓里,浑然不觉,荼毒流弊甚为深远。正本清源之路,漫漫修远。本府一已之力,深感力不从心,望和天下有志之士一道,扬善锄恶,共致太平盛世。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12639172/viewspace-674403/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    2376
  • 访问量
    5765946