来自IDataReader的.NET对象水合作用性能缓慢

时间:2009-03-30 08:13:21

标签: .net performance string datareader

我正在尝试为大约400个业务对象添加水分,当需要水合字符串时,性能变得非常慢。它需要超过20秒来补充400个物体。

修改

我们使用MySQL 5.1和dotConnect for MySQL v5.0.12作为数据提供者http://www.devart.com/dotconnect/mysql/

我做了一些基准测试,将其缩小到导致问题的字符串类型。我开始测量从记录2到n的时间,以忽略加载其他组件可能会占用的时间。

以下代码在0ms

中水合1个对象
objUserInfo.PortalID = portalId
objUserInfo.IsSuperUser = Convert.ToBoolean(dr("IsSuperUser"))
objUserInfo.UserID = Convert.ToInt32(dr("UserID"))

这也可以在0毫秒内水合1个物体

objUserInfo.PortalID = portalId
objUserInfo.IsSuperUser = Convert.ToBoolean(dr("IsSuperUser"))
objUserInfo.UserID = Convert.ToInt32(dr("UserID"))
objUserInfo.Firstname = "FirstName"

但是,只要我将datareader对象转换为字符串,平均需要53毫秒

objUserInfo.PortalID = portalId
objUserInfo.IsSuperUser = Convert.ToBoolean(dr("IsSuperUser"))
objUserInfo.UserID = Convert.ToInt32(dr("UserID"))
objUserInfo.Firstname = Convert.ToString(dr("FirstName"))

我还尝试过保湿2根绳子和strangley,它的性能几乎不会超过1弦? 以下仅需要平均57毫秒来水合1个物体

objUserInfo.PortalID = portalId
objUserInfo.IsSuperUser = Convert.ToBoolean(dr("IsSuperUser"))
objUserInfo.UserID = Convert.ToInt32(dr("UserID"))
objUserInfo.Firstname = Convert.ToString(dr("FirstName"))
objUserInfo.LastName = Convert.ToString(dr("LastName"))

我知道很多人使用上面的语法来保护业务对象。是否有更有效/更快的方法来做到这一点?

修改 刚做了另一个测试,就是对一个字符串进行直播,并产生相同的慢速:( 53ms只是为了演员。

objUserInfo.FirstName = DirectCast("alex", String)

3 个答案:

答案 0 :(得分:2)

尝试一下:

而不是

objUserInfo.Firstname = Convert.ToString(dr("FirstName"))

使用

objUserInfo.Firstname = dr.GetString(2);
  1. 使用GetXXX方法并依靠Microsoft优化转换。 (编辑:我怀疑Convert.ToString(dr("FirstName"))正在进行一些丑陋的隐性和耗时的转换和/或(联合国)装箱操作。)
  2. 使用数字索引器(2)代替使用字符串索引器(“FirstName”)访问列。这更快,但可读性更低。
  3. 编辑:Alex发现了这个问题。这不是铸造问题!他对此的评论:

      

    好吧,我已经找到了问题!   我正在使用DotNetNuke并填充一个   它的标准物体。问题   是我设置FirstName的时候   财产它再次呼吁   一个配置文件对象是什么   实际上需要这么久!没什么   与字符串转换或   铸造。

答案 1 :(得分:1)

您使用什么数据提供商?我们与oracle有一个丑陋的问题。

最有效的方法是调用dr.GetString(columnNumber) - 你可以通过dr.GetOrdinal(columnName)得到的列号(你可以在读取循环的开头缓存)。

然而,这不应该是问题。不能是列的大小吗?

答案 2 :(得分:0)

  

我还尝试过保湿2根绳子和strangley,它的性能几乎不会超过1弦?以下仅需要平均57毫秒来水合1个物体

你是如何衡量时间的?也许有一个额外的装配加载,你的53毫秒考虑到这一点。

您应该在第一次循环(第一次补水)后才开始测量时间。这样,任何装配加载都将在测量之前完成。