标题:性能相差7千倍的ToString()方法
只看楼主
bygg
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:乖乖的心中
等 级:版主
威 望:241
帖 子:13555
专家分:3076
注 册:2006-10-23
结帖率:93.75%
 问题点数:0 回复次数:8 
性能相差7千倍的ToString()方法
  ToString()方法大概是.Net时被用得最多的方法了,所有类型都,引用的,值的,都传承了这个从祖先Object开始的光荣传统。调用一次ToString,相当于惊堂木“啪”一下,大喝“堂下案犯报上名来”,这家伙就全招了。
  可是写程序如查案,形形色色的人都有,对于些记性差,反应迟钝的家伙,就没那么顺利了。梅(枚)举人就是其中之一,来审问下看看:
程序代码:
static void testEnumToString()
{
    var day = DayOfWeek.Wednesday;
    string value = null;
    for (int i = 0; i < 1000000; i++)
    {
        value = day.ToString();
    }
    Console.WriteLine(value);
}
整理下结果:

次数     1     2    3   4
时间(ms) 7135 7009 7174 7010

看上去没什么,不过根据以往的断案经验,其中似有猫腻。本所以继续下面的代码:
程序代码:
static void testEnumToString2()
{
     var day = DayOfWeek.Wednesday;
     string value = null;
     for (int i = 0; i < 1000000; i++)
     {
         switch (day)
         {
             case DayOfWeek.Friday:
                 value = "Friday";
                 break;
             case DayOfWeek.Monday:
                 value = "Monday";
                 break;
             case DayOfWeek.Saturday:
                 value = "Saturday";
                 break;
             case DayOfWeek.Sunday:
                 value = "Sunday";
                 break;
             case DayOfWeek.Thursday:
                 value = "Thursday";
                 break;
             case DayOfWeek.Tuesday:
                 value = "Tuesday";
                 break;
             case DayOfWeek.Wednesday:
                 value = "Wednesday";
                 break;
             default:
                 break;
         }
     }
     Console.WriteLine(value);
}

结果:
次数     1 2 3 4
时间(ms) 2 1 1 1

再使用Reflector查看了一下。
程序代码:
public override string ToString()
{
    return InternalFormat((RuntimeType) base.GetType(), this.GetValue());
}

private static string InternalFormat(RuntimeType eT, object value)
{
    if (eT.IsDefined(typeof(FlagsAttribute), false))
    {
        return InternalFlagsFormat(eT, value);
    }
    string name = GetName(eT, value);
    if (name == null)
    {
        return value.ToString();
    }
    return name;
}

在tostring()中用到了反射,所以是以时间换空间的做法,虽然基本不用写代码,而且占用的空间也少,但是却大大地浪费了时间。
相对于switch方法而言,没有将结果字符串硬编码在处理函数中,以后枚举中增加或删除某一项,也不影响调用代码,可维护性相对更好一些。但是也应该看到,这是一种空间换时间的做法,避开了反射,但是系统需要额外存储一个字典对象,占用的内存要比原来多一些。

不过在实际的项目中应该如何运用,这就得看具体情况了,呵呵。

其中的数据虽然会因为不同的PC而不同,但是经过我自己的测试,的确发现其中的差异是非常巨大的。所以无论是有兴趣或者是没兴趣的朋友,都注意一下。或者是自己做一下测试。

搜索更多相关主题的帖子: 性能 ToString 
2010-09-28 13:17
gameohyes
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:53
帖 子:1275
专家分:3629
注 册:2009-3-5
得分:0 
支持

C#超级群 74862681,欢迎大家的到来!
2010-09-28 22:32
bygg
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:乖乖的心中
等 级:版主
威 望:241
帖 子:13555
专家分:3076
注 册:2006-10-23
得分:0 
所以以后要小心一些咯.

飘过~~
2010-09-29 17:43
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
得分:0 
tostring肯定要耗更多时间!但不能用你的那个时间来比较!虽然可能相差比较大,但实际运行时,只运行一次!也就是绝对耗时还是很小的!

[ 本帖最后由 cnfarer 于 2010-9-30 06:32 编辑 ]

★★★★★为人民服务★★★★★
2010-09-30 06:28
zhoufeng1988
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:北京
等 级:贵宾
威 望:27
帖 子:1432
专家分:6329
注 册:2009-5-31
得分:0 
顶bbyy
2010-09-30 09:11
bygg
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:乖乖的心中
等 级:版主
威 望:241
帖 子:13555
专家分:3076
注 册:2006-10-23
得分:0 
以下是引用zhoufeng1988在2010-9-30 09:11:36的发言:

顶bbyy

晕,我的名字是bygg

飘过~~
2010-09-30 09:18
bygg
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:乖乖的心中
等 级:版主
威 望:241
帖 子:13555
专家分:3076
注 册:2006-10-23
得分:0 
以下是引用cnfarer在2010-9-30 06:28:24的发言:

tostring肯定要耗更多时间!但不能用你的那个时间来比较!虽然可能相差比较大,但实际运行时,只运行一次!也就是绝对耗时还是很小的!

我们平时用到ToString()时,基本都是在一个方法里用到一两次而已,所以我们根本感觉不到它对时间的消耗。
我这里只是想说明用ToString()时,有着它的优缺点,大家具体怎么用,还得看项目的实际情况。

飘过~~
2010-09-30 09:20
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
得分:0 
从来不用var类型。。。

女侠,约吗?
2010-10-01 10:48
zhangkecd
Rank: 2
来 自:闲云工作室
等 级:论坛游民
帖 子:159
专家分:91
注 册:2009-3-13
得分:0 
高手会集,学习了。
tostring确实用的比较多。作用也比较大。

闲云野鹤---梦想  
2010-10-01 13:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-321582-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.225840 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved