如何减少执行时间? ProfileBase 的 GetPropertyValue 执行需要 40ms
How to reduce the execution time? ProfileBase's GetPropertyValue takes 40ms to execute
我有以下代码,其中我使用 MembershipUser
数组创建自定义列表 class。
以下是创建列表的自定义 class:
public class userandGroup :IComparable{
public string id { get; set; }
public string Name { get; set; }
public string DisplayName { get; set; }
public string type { get; set; }
public int? CompareTo(Object obj)
{
if (obj is userandGroup)
return this.DisplayName.CompareTo((obj as userandGroup).DisplayName);
return null;
}
}
以下是填充 userlist
的代码:
MembershipUserCollection tempuserlist = GetProvider("DefaultProfileProvider", applicationName).GetAllUsers(currentPage - 1, pageSize, out totalUsers);
MembershipUser[] userlist = new MembershipUser[totalUsers];
tempuserlist.CopyTo(userlist, 0);
以下是生成 userandGroup
(自定义 class)列表的代码:
foreach (MembershipUser usr in userlist)
{
userandGroup usrgp = new userandGroup();
usrgp.id = ((Guid)usr.ProviderUserKey).ToString() ;
usrgp.Name = usr.UserName;
ProfileBase profile = ProfileBase.Create(usr.UserName);
profile.Initialize(usr.UserName, true);
// Following line approximately takes 40ms per loop.
usrgp.DisplayName = profile.GetPropertyValue("FirstName").ToString() + " " + profile.GetPropertyValue("LastName").ToString();
usrgp.type = "user";
lst.Add(usrgp);
}
如评论中所写,行;
usrgp.DisplayName = profile.GetPropertyValue("FirstName").ToString() + " " + profile.GetPropertyValue("LastName").ToString();
一个循环需要 40 毫秒才能完成。我现在有 40 个用户。因此循环执行大约需要 1600 毫秒。如果用户数量增加,循环将花费大量时间才能完成。
我怎样才能减少该行的执行时间,或者有没有其他方法可以从 ProfileBase
获取用户的名字和姓氏?
根据@TyCobb 的建议,我使用了 Parallel Foreach 循环。我按如下方式更新了循环。
Object obj = new Object();
Parallel.ForEach(userlist, (usr) =>
{
userandGroup usrgp = new userandGroup();
usrgp.id = ((Guid)usr.ProviderUserKey).ToString();
usrgp.Name = usr.UserName;
ProfileBase profile = ProfileBase.Create(usr.UserName);
profile.Initialize(usr.UserName, true);
usrgp.type = "user";
usrgp.DisplayName = profile.GetPropertyValue("FirstName").ToString() + " " + profile.GetPropertyValue("LastName").ToString();
lock (obj)
{
lst.Add(usrgp);
}
});
虽然这提高了一点性能,但性能还不是最佳的。现在整个循环在不到一秒内完成。
我有以下代码,其中我使用 MembershipUser
数组创建自定义列表 class。
以下是创建列表的自定义 class:
public class userandGroup :IComparable{
public string id { get; set; }
public string Name { get; set; }
public string DisplayName { get; set; }
public string type { get; set; }
public int? CompareTo(Object obj)
{
if (obj is userandGroup)
return this.DisplayName.CompareTo((obj as userandGroup).DisplayName);
return null;
}
}
以下是填充 userlist
的代码:
MembershipUserCollection tempuserlist = GetProvider("DefaultProfileProvider", applicationName).GetAllUsers(currentPage - 1, pageSize, out totalUsers);
MembershipUser[] userlist = new MembershipUser[totalUsers];
tempuserlist.CopyTo(userlist, 0);
以下是生成 userandGroup
(自定义 class)列表的代码:
foreach (MembershipUser usr in userlist)
{
userandGroup usrgp = new userandGroup();
usrgp.id = ((Guid)usr.ProviderUserKey).ToString() ;
usrgp.Name = usr.UserName;
ProfileBase profile = ProfileBase.Create(usr.UserName);
profile.Initialize(usr.UserName, true);
// Following line approximately takes 40ms per loop.
usrgp.DisplayName = profile.GetPropertyValue("FirstName").ToString() + " " + profile.GetPropertyValue("LastName").ToString();
usrgp.type = "user";
lst.Add(usrgp);
}
如评论中所写,行;
usrgp.DisplayName = profile.GetPropertyValue("FirstName").ToString() + " " + profile.GetPropertyValue("LastName").ToString();
一个循环需要 40 毫秒才能完成。我现在有 40 个用户。因此循环执行大约需要 1600 毫秒。如果用户数量增加,循环将花费大量时间才能完成。
我怎样才能减少该行的执行时间,或者有没有其他方法可以从 ProfileBase
获取用户的名字和姓氏?
根据@TyCobb 的建议,我使用了 Parallel Foreach 循环。我按如下方式更新了循环。
Object obj = new Object();
Parallel.ForEach(userlist, (usr) =>
{
userandGroup usrgp = new userandGroup();
usrgp.id = ((Guid)usr.ProviderUserKey).ToString();
usrgp.Name = usr.UserName;
ProfileBase profile = ProfileBase.Create(usr.UserName);
profile.Initialize(usr.UserName, true);
usrgp.type = "user";
usrgp.DisplayName = profile.GetPropertyValue("FirstName").ToString() + " " + profile.GetPropertyValue("LastName").ToString();
lock (obj)
{
lst.Add(usrgp);
}
});
虽然这提高了一点性能,但性能还不是最佳的。现在整个循环在不到一秒内完成。