[已解决问题] 关于对象转换性能问题
提问时间: 2007-12-29 23:09
悬赏分:5 浏览:512 次

Convert.ToInt32(dr["NewsId"]);
int.Parse(dr["NewsId"].ToString());

以上两种转换方法哪种性能更好些呢?


最佳答案
dr.GetInt32(0)
2007/12/30 15:41:38 回答者:Dove.Net


提问者对于答案的评价:网上又搜了一遍,dr.GetInt32(0)确实比Convert.Toxxx 和xx.Parse效率更高,但是直接使用索引容易导致赋值错误,无奈,没有两全的办法。。
其它回答(6)
第二个好一点吧.

如果注重性能,并且这样的代码确实是性能瓶颈的话,可以不要使用"NewsId"这样的字符串作为索引器参数,而使用整数. 也可以这样: static readonly COL_NewsId=0; news.Id=dr[COL_NewsId],这样好读一点.

另外,其实int.Parse性能也比较差,不如自己写一个更快的转换方法.
6个月前   回答者:deerchao - 大侠五级
            object o = "1234567";

            DateTime start = DateTime.Now;
            for (int i = 0; i < 1000*1000; i++)
            {
                int k = Convert.ToInt32(o);
            }

            Console.WriteLine(((TimeSpan)(DateTime.Now - start)).TotalMilliseconds);

            DateTime start2 = DateTime.Now;
            for (int m = 0; m < 1000 * 1000; m++)
            {
                int n = int.Parse(o.ToString());
            }

            Console.WriteLine(((TimeSpan)(DateTime.Now - start2)).TotalMilliseconds);

结果 :
328
296

从结果上看第二种略好,但俺觉得还是应该使用第一种写法. 因为ToString()会创建临时的String变量, 会增加GC开销.
6个月前   回答者:沙加 - 老鸟四级
我一般都用第一种,感觉性能差别不太大
不是性能关键部分,无所谓吧
6个月前   回答者:JesseZhao - 菜鸟二级
用Reflector 查看源码:
Convert类:
public static int ToInt32(object value)
{
    if (value != null)
    {
        return ((IConvertible) value).ToInt32(null);
    }
    return 0;
}
参数为object时调用什么样的方法是要看该value实际类型的。
如果为string:
 String类:
int IConvertible.ToInt32(IFormatProvider provider)
{
    return Convert.ToInt32(this, provider);
}
Convert类:
public static int ToInt32(string value, IFormatProvider provider)
{
    if (value == null)
    {
        return 0;
    }
    return int.Parse(value, NumberStyles.Integer, provider);
}
最后回到了调用int.Parse(...)

如果是其他类型并不完全不同。
这个性能差别就在几个函数的调用上。可以说几乎区别是非常小的。
如果真要最求这个性能,我推荐用int.TryParse(...)。这个方法不会抛出异常。
一个异常的抛出和捕获比几个函数的调用消耗可大多了。
6个月前   回答者:壁虎 - 初学一级
同 壁虎
最好用tryparse:)
异常抛出的消耗更大
6个月前   回答者:wingoo - 小虾三级
@沙加
ToInt32还有装箱带来的问题呢?
楼主可以自己写段代码测试一下,一般情况下还是第二种更好点。
6个月前   回答者:阿不 - 小虾三级
评论
6个月前   红尘中迷茫 :
谢谢大家关注。非常感谢 :)
   您需要登录以后才能回答!
我的问题    我要提问


快到期问题

> 问题排行榜

有不合适内容,建议去除