我正在尝试对约 400 个业务对象的列表进行水合,当它需要对字符串进行水合时,性能会变得非常慢。为 400 个物体补水需要超过 20 秒。
编辑
我们使用 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 对象转换为字符串,平均需要 53ms
objUserInfo.PortalID = portalId
objUserInfo.IsSuperUser = Convert.ToBoolean(dr("IsSuperUser"))
objUserInfo.UserID = Convert.ToInt32(dr("UserID"))
objUserInfo.Firstname = Convert.ToString(dr("FirstName"))
我还尝试为 2 根琴弦补水并扼杀它并没有像 1 根琴弦那样吹出性能?以下仅需要平均 57ms 来水化 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)