我正在尝试为大约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)
答案 0 :(得分:2)
尝试一下:
而不是
objUserInfo.Firstname = Convert.ToString(dr("FirstName"))
使用
objUserInfo.Firstname = dr.GetString(2);
Convert.ToString(dr("FirstName"))
正在进行一些丑陋的隐性和耗时的转换和/或(联合国)装箱操作。)编辑:Alex发现了这个问题。这不是铸造问题!他对此的评论:
好吧,我已经找到了问题! 我正在使用DotNetNuke并填充一个 它的标准物体。问题 是我设置FirstName的时候 财产它再次呼吁 一个配置文件对象是什么 实际上需要这么久!没什么 与字符串转换或 铸造。
答案 1 :(得分:1)
您使用什么数据提供商?我们与oracle有一个丑陋的问题。
最有效的方法是调用dr.GetString(columnNumber) - 你可以通过dr.GetOrdinal(columnName)得到的列号(你可以在读取循环的开头缓存)。
然而,这不应该是问题。不能是列的大小吗?
答案 2 :(得分:0)
我还尝试过保湿2根绳子和strangley,它的性能几乎不会超过1弦?以下仅需要平均57毫秒来水合1个物体
你是如何衡量时间的?也许有一个额外的装配加载,你的53毫秒考虑到这一点。
您应该在第一次循环(第一次补水)后才开始测量时间。这样,任何装配加载都将在测量之前完成。