none
关于数据类型转换效率问题 RRS feed

  • 问题

  • 我们常用的数据类型有:

    (string)reader["Name"]
    Convert.ToString(reader["Name"])
    以及reader["Name"] as Table

    我想问:从SqlDataReader或者其他集合中转换数据类型,构造实体类。
    是(string)reader["Name"]好?还是Convert.ToString(reader["Name"])好?为什么?


    付出不一定有回报,不付出那就一定没有回报!
    2010年5月22日 6:56

答案

  • 你好!

         静态类主要看你使用是否得当,如果使用的合适,还可以提升程序的性能!

         静态成员在整个应用程序域的生命周期中都有效,这有利有弊,一方面如果你的静态成员占用的内存比较多,那这部分内存会长期得不到释放 ,另外,所有对象在整个应用程序域的生命周期中都可以使用静态成员,这一定程度上也节省了每个对象分别创建字段占用的内存!

         关于静态类,可以参考:

    http://msdn.microsoft.com/zh-cn/library/79b3xss3%28VS.80%29.aspx


    周雪峰
    • 已标记为答案 原HUGO.CM 2010年5月22日 12:59
    2010年5月22日 12:04
    版主
  • 你好!

        通常来说Convert类的静态方法在性能方面要差一些,除非必须使用它来转换,一般情况下使用强制类型转换就可以了!


    周雪峰


    这个可能不一定性能会差。Convert 类会检查目标类型以及源类型是否可转换 (通过检查目标类型是否实现 IConvertible),如果实现了 IConvertible,则调用 IConvertible 上的方法进行转换。

    SqlDataReader.this[] 其实读出来的基类型是 object,其真正类型是表达式返回的类型,因此,直接用 as,或者强制类型转换,其本身并没有涉及到 Convert,而是简单的修改了变量的类型而已。所以,这种效率是最高的。


    Mark Zhou
    • 已标记为答案 原HUGO.CM 2010年5月24日 10:57
    2010年5月24日 9:36

全部回复

  • 你好!

        通常来说Convert类的静态方法在性能方面要差一些,除非必须使用它来转换,一般情况下使用强制类型转换就可以了!


    周雪峰
    2010年5月22日 9:02
    版主
  • 静态类和非静态类在使用上是否存在性能问题!?


    付出不一定有回报,不付出那就一定没有回报!
    2010年5月22日 11:36
  • 你好!

         静态类主要看你使用是否得当,如果使用的合适,还可以提升程序的性能!

         静态成员在整个应用程序域的生命周期中都有效,这有利有弊,一方面如果你的静态成员占用的内存比较多,那这部分内存会长期得不到释放 ,另外,所有对象在整个应用程序域的生命周期中都可以使用静态成员,这一定程度上也节省了每个对象分别创建字段占用的内存!

         关于静态类,可以参考:

    http://msdn.microsoft.com/zh-cn/library/79b3xss3%28VS.80%29.aspx


    周雪峰
    • 已标记为答案 原HUGO.CM 2010年5月22日 12:59
    2010年5月22日 12:04
    版主
  • 可用不可滥用!


    付出不一定有回报,不付出那就一定没有回报!
    2010年5月22日 12:59
  • 非常谢谢~
    付出不一定有回报,不付出那就一定没有回报!
    2010年5月22日 12:59
  • 不客气啊!
    周雪峰
    2010年5月22日 13:12
    版主
  • 你好!

        通常来说Convert类的静态方法在性能方面要差一些,除非必须使用它来转换,一般情况下使用强制类型转换就可以了!


    周雪峰


    这个可能不一定性能会差。Convert 类会检查目标类型以及源类型是否可转换 (通过检查目标类型是否实现 IConvertible),如果实现了 IConvertible,则调用 IConvertible 上的方法进行转换。

    SqlDataReader.this[] 其实读出来的基类型是 object,其真正类型是表达式返回的类型,因此,直接用 as,或者强制类型转换,其本身并没有涉及到 Convert,而是简单的修改了变量的类型而已。所以,这种效率是最高的。


    Mark Zhou
    • 已标记为答案 原HUGO.CM 2010年5月24日 10:57
    2010年5月24日 9:36
  • Mark,你好!    多谢你的指教啊!尽管Convert在设计的时候有类似的智能的检查,但是这个检查本身也是有性能开销的吧(似乎有些较真了)!

        我上面的建议也不是很稳妥,更好的方式是as关键字来转换,这样可以避免强制类型转换抛出异常的可能性!


    周雪峰
    2010年5月24日 10:48
    版主
  • Mark,你好!    多谢你的指教啊!尽管Convert在设计的时候有类似的智能的检查,但是这个检查本身也是有性能开销的吧(似乎有些较真了)!

        我上面的建议也不是很稳妥,更好的方式是as关键字来转换,这样可以避免强制类型转换抛出异常的可能性!


    周雪峰

    as 转换貌似只支持引用类型吧
    付出不一定有回报,不付出那就一定没有回报!
    2010年5月24日 10:56
  • 你好!

           是的!as只能应用于引用类型!


    周雪峰
    2010年5月24日 14:07
    版主
  • 怎么用C#代码操作大量sql脚本

    就是创建数据库、表、字段、关系、插入信息


    付出不一定有回报,不付出那就一定没有回报!
    2010年5月24日 15:12
  • 你好!     可以通过SqlCommand来执行,也可以直接调用存储过程!
    周雪峰
    2010年5月24日 15:36
    版主
  • 执行多条语句就报错

    如果加上“GO”也报错


    付出不一定有回报,不付出那就一定没有回报!
    2010年5月24日 15:55
  • 你好!

         可以通过条用存储过程的方式调用,具体可以参考:

    http://www.cnblogs.com/JoeDZ/archive/2008/09/26/1299496.html

         希望对你有帮助!


    周雪峰
    2010年5月25日 2:34
    版主
  • SQL Command 不能执行 GO

    使用 Go 做为关键字,将 SQL 拆分成若干条后再分别依次执行。

    拆分时要考虑 go 单独一行时才能拆分,否则可能造成语句不完整。

    select 1 from ..

    go

    select 1 from .

    上面可以拆分

    select from tablego // tablego 是表名,包含了 go 不能拆分

    select from table1

     


    知识改变命运,奋斗成就人生!
    2010年5月25日 3:44
    版主
  • Mark,你好!    多谢你的指教啊!尽管Convert在设计的时候有类似的智能的检查,但是这个检查本身也是有性能开销的吧(似乎有些较真了)!

        我上面的建议也不是很稳妥,更好的方式是as关键字来转换,这样可以避免强制类型转换抛出异常的可能性!


    周雪峰


    不客气。是的,Convert 本身一定会有性能开销的,不过这个开销可以被忽略不计。它属于 CLR 行为,而非用户行为。

    在我们分析性能问题的时候,往往会谈到性能开销问题 (performance hurt),现在我们更习惯性的说性能开销问题是一个副作用 (side effect) 问题,其实任何函数调用都会有性能损耗,只不过,这些损耗对于其函数本身是否是可忽略才是问题的关键。比方说,函数调用需要寄存器 + 栈协作,这部分损耗完全可以忽略的。

    因此,性能问题也就是副作用大小的问题,绝对没有副作用的纯函数 (pure function) 是不存在的,

    以后大家可以多多交流这方面的问题。

     


    Mark Zhou
    2010年5月26日 7:49
  • 可以用;

    select 1 from...;select 2 from...

    2010年5月26日 8:15