Обязательное предложение по повышению производительности методов C#.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Обязательное предложение по повышению производительности методов C#.

Сообщение Anonymous »

Я работаю над задачей оптимизации кода. Ниже приведен подробный код

Код: Выделить всё

public class UserPrivileges
{
#region Properties

public int UserId { get; set; }
public int NPSiteId { get; set; }
public string UserName{ get; set; }
public bool IsPlaybackPortalAdministrator { get; set; }
public Dictionary Permissions { get; set; }
public string LoginName { get; set; }
public string OSLogin { get; set; }
public int ITenantID { get; set; }

#endregion

#region Constructor

public UserPrivileges()
{
IsPlaybackPortalAdministrator = false;
Permissions = new Dictionary();
}

#endregion

#region Override Methods

public override string ToString()
{
StringBuilder sb = new StringBuilder();

sb.AppendLine(string.Format("User ID {0}, User Name {1} , NPSiteId {2}, Is Playback Portal Administrator {3}", UserId,
UserName,
0,
IsPlaybackPortalAdministrator));

if (Permissions.Count > 0)
{
foreach (KeyValuePair permission in Permissions)
{
if (permission.Value != null)
{
int dbId = permission.Value.DbId;
string dbName = permission.Value.DbName;

//Permissions
if (permission.Value.Permissions != null)
{
foreach (KeyValuePair per in permission.Value.Permissions)
{
if (per.Value.IsApproved)
{
sb.AppendLine(string.Format("DB Id {0} DB Name {1} " +
"- Permission Id {2} - Permission Value to display {3}",
dbId,dbName, per.Value.ResourceId, per.Value.DisplayValue));
}
}
}
}
}
}
else
{
sb.AppendLine("No Permissions");
}

return sb.ToString();

}

public string UsersPrivilegesToolTip
{
get
{
// User Login name and OS login
return string.Format("Login Name: {0}{1}OS Login: {2}", LoginName, Environment.NewLine, OSLogin);
}
}
#endregion

public void CopyPrivileges(Dictionary privileges)
{
foreach(KeyValuePair privilegeToCopy in privileges)
{
//Permissions
foreach (KeyValuePair perm in privilegeToCopy.Value.Permissions)
{
Permissions[privilegeToCopy.Key].Permissions[perm.Key].IsApproved = perm.Value.IsApproved;
}
}
}
}

public class LegacySitePrivileges
{
#region Properties

public string DbName { get; set; }
public int DbId { get; set; }

public PBPVersion Version { get; set; }

public string DBAdminConnectionString { get; set; }

public Dictionary Permissions { get; set; }

#endregion

#region Constructor

public LegacySitePrivileges()
{
Permissions = new Dictionary();
}

#endregion

public override string ToString()
{
return string.Format("DB Name {0} DB ID {1}", DbName, DbId);
}
}

public class PrivilegesResource
{
#region Properties
public int ResourceId{ get; set; }
public string DisplayValue { get; set; }
public string Description { get; set; }
public bool IsApproved { get; set; }
#endregion
}

public class PrivilegesResourcePermission : PrivilegesResource
{
#region Constructor
public PrivilegesResourcePermission()
{
IsApproved = false;
}
#endregion
}

public class LegacySitePrivilegesId
{
public int DBId { get; set; }
public int OriginalSiteId { get; set;  }

public LegacySitePrivilegesId(int dbId, int siteId)
{
DBId = dbId;
OriginalSiteId = siteId;
}

public override string ToString(){
return DBId + "_" + OriginalSiteId;
}
}
Ниже приведены затронутые методы

пространство имен WebPortal.Client.Entities
{

Код: Выделить всё

public class UsersPrivilegesDataManager
{

public Dictionary LoadPrivileges(User user)
{
const string methodName = CLASS_NAME + ":" + "LoadPrivileges";
m_User = user;
m_log.InfoFormat("{0} . Start to load the privileges ", methodName);
var userPrivileges = LoadNimUsersWithPrivilegesToPlaybackPortal();
CreateUserPrivilegesObjects(userPrivileges);
ResolvePrivileges(userPrivileges);
m_OriginalUserEntity = ConvertUserPrivilegesToUserEntity(userPrivileges);
m_log.DebugFormat("{0} . Leaving the method with {1} number of user privileges", methodName, userPrivileges.Count);
return userPrivileges;
}

private Dictionary LoadNimUsersWithPrivilegesToPlaybackPortal()
{
const string methodName = CLASS_NAME + ":" + "LoadNIMUsersWithPrivilegesToPlaybackPortal";
m_log.DebugFormat("{0} . Start to load the list of users who have access to the playback portal", methodName);

var playbackPortalAdministratorsIDs = new List();
var playbackPortaNotTenantUserIDs = new List();
var users = new Dictionary();

//Call the query service to get all the privileges
m_log.DebugFormat("{0} . Calling the query service in order to get users who have privileges to the playback portal", methodName);
string error;
var userDataSet = m_queryServiceClient.GetWebPortalNPGroupAndUserData(out error);
var isBusinessUser = m_User.IsBusinessUser
&& !m_User.IsSuperUser
&& !m_User.IsWebPortalAdministrator;

//m_log.DebugFormat("{0} . m_User.IsBusinessUser: {1}. m_User.IsSuperUser: {2}. m_User.IsWebPortalAdministrator: {3}.  isBusinessUser: {4} ",methodName
//   m_User.IsBusinessUser, m_User.IsSuperUser, m_User.IsWebPortalAdministrator, isBusinessUser, );

int tenantID = 0;
int tenantIdFotBussinessTenant=0;
int userId;
bool isTenant = false;

if (m_User.IsBusinessUser)
{
foreach (DataRow row in userDataSet.Tables[0].Rows)
{
userId = int.Parse(row["iUserID"].ToString());
tenantID = int.Parse(row["iTenantID"].ToString());
//find the tenantId for Business Tenant user
if ((userId == m_User.UserId) && (tenantID != -1))
{
tenantIdFotBussinessTenant = tenantID;
isTenant = true;
}
}
}

if (userDataSet != null && userDataSet.Tables.Count > 0)
{
foreach (DataRow row in userDataSet.Tables[0].Rows)
{
var isPlaybackPortalAdministrator = false;
userId = int.Parse(row["iUserID"].ToString());
tenantID = int.Parse(row["iTenantID"].ToString());

//Handle playback portal administrators / business users
var privilegeId = int.Parse(row["iPrivilegeId"].ToString());

m_log.DebugFormat("{0} .  Calling the query service in order to get users who have privileges to the playback portal", methodName);
if (privilegeId == 2 ||
(isBusinessUser && privilegeId == 3))
{
isPlaybackPortalAdministrator = true;
}

//Add the user to the list
if (!users.ContainsKey(userId))
{
users.Add(userId, new UserPrivileges
{
UserId = int.Parse(row["iUserId"].ToString()),
UserName = row["FormattedName"].ToString(),
NPSiteId = int.Parse(row["iSiteId"].ToString()),
LoginName = row["nvcLoginName"].ToString(),
OSLogin = row["nvcOsLogin"].ToString(),
ITenantID = int.Parse(row["iTenantID"].ToString())

});
m_log.InfoFormat("{0} . Adding User ID {1} UserName {2} NPSiteID {3} Is Admin {4} LoginName {5} OSLogin {6} Tenant ID {7}",
methodName,
int.Parse(row["iUserId"].ToString()),
row["FormattedName"],
int.Parse(row["iSiteId"].ToString()),
isPlaybackPortalAdministrator,
row["nvcLoginName"],
row["nvcOsLogin"],
int.Parse(row["iTenantID"].ToString()));
}
if (isTenant == true)
{
//remove all users without tenantID
if ((tenantID != tenantIdFotBussinessTenant)&& (users.ContainsKey(userId)))
{
playbackPortaNotTenantUserIDs.Add(userId);
}
}

//Manage the list of playback portal administrators
if (users.ContainsKey(userId))
{
if (isPlaybackPortalAdministrator)
{
playbackPortalAdministratorsIDs.Add(userId);
}
}
}
}

//Remove the administrators from this list since they have privileges to the entire playback portal
foreach (int administrator in playbackPortalAdministratorsIDs)
{
m_log.DebugFormat("{0} . Removing the User ID {1} from the list of users since he's playback portal administrator or business user", methodName, administrator);
users.Remove(administrator);
}

foreach (var notTenantUserID in playbackPortaNotTenantUserIDs)
{
m_log.DebugFormat("{0} . Removing the User ID {1} from the list of users since he's not tenant", methodName, notTenantUserID);
users.Remove(notTenantUserID);
}
m_log.DebugFormat("{0} . Leaving the method", methodName);

return users;
}

private void CreateUserPrivilegesObjects(Dictionary users)
{
const string methodName = CLASS_NAME + ":" + "CreateUserPrivilegesObjects";
m_log.DebugFormat("{0} .  Start to create the UserPrivileges object according to the permissions the user have", methodName);

//Foreach user from the users who have privilegs to playback portal
foreach (KeyValuePair user in users)
{
foreach (LegacySitePrivileges sitePrivilege in m_legacySites)
{

int legacySitePrivId = sitePrivilege.DbId;
if (!users[user.Key].Permissions.ContainsKey(legacySitePrivId))
{
users[user.Key].Permissions.Add(legacySitePrivId, new LegacySitePrivileges
{
DBAdminConnectionString = string.Empty,//sitePrivilege.DBAdminConnectionString,
Version = sitePrivilege.Version,
DbName = sitePrivilege.DbName,
DbId = sitePrivilege.DbId
});
}

foreach (KeyValuePair permissions in sitePrivilege.Permissions)
{
bool isApprove = user.Value.IsPlaybackPortalAdministrator;

legacySitePrivId = sitePrivilege.DbId;
if (!users[user.Key].Permissions[legacySitePrivId].Permissions.ContainsKey(permissions.Value.ResourceId))
{
users[user.Key].Permissions[legacySitePrivId].Permissions.Add(permissions.Value.ResourceId, new PrivilegesResource
{
DisplayValue = permissions.Value.DisplayValue,
Description = permissions.Value.Description,
ResourceId = permissions.Value.ResourceId,
IsApproved = isApprove
});
}
}

m_log.DebugFormat("{0}. Created {1} User Objects for LegacySite.Count = {2} ", methodName,users.Count,m_legacySites.Count);
}
}

m_log.DebugFormat("{0} . Leaving the method", methodName);
}

private void ResolvePrivileges(Dictionary users)
{
const string methodName = CLASS_NAME + ":" + "ResolvePrivileges";
m_log.DebugFormat("{0} . Load the playback portal privileges each user have", methodName);
//Call the query service in order to get the list of users and their permissions to the playback portal
m_log.DebugFormat("{0} . Calling the query service in order to get the list of users and their permissions to the playback portal", methodName);
string error;
DataSet userDataSet = m_queryServiceClient.GetWebPortalUserConfiguration(out error);

//Go over the results
if (userDataSet != null && userDataSet.Tables.Count > 0)
{
foreach (DataRow row in userDataSet.Tables[0].Rows)
{
int userId = int.Parse(row["iUserID"].ToString());
if (users.ContainsKey(userId))
{
int dbID = int.Parse(row["iDbID"].ToString());
int resourceId = int.Parse(row["iResourceID"].ToString());

LegacySitePrivileges outLegacySitePrivileges;

if (users[userId].Permissions.TryGetValue(dbID, out outLegacySitePrivileges))
{
PrivilegesResource outPrivilegesResource;

if (outLegacySitePrivileges.Permissions.TryGetValue(resourceId, out outPrivilegesResource))
{
outPrivilegesResource.IsApproved = true;
m_log.DebugFormat("{0} . Adding Permission to User ID {1}. Resource ID {2}",
methodName,
userId,
resourceId);
}
}
else
{
m_log.WarnFormat("{0} . no legacySiteId:{1} for user Id{2}", methodName, dbID, userId);
}
}
else
{
m_log.DebugFormat("{0} . User ID {1} doesn't exits in the list of users that have permissions to the playback portal.  He's permissions won't be added",methodName, userId);
}

}
}
m_log.DebugFormat("{0} . Leaving the method ", methodName);
}

private List ConvertUserPrivilegesToUserEntity(Dictionary updatedUsersPrivilegs)
{
const string methodName = CLASS_NAME + ":" + "ConvertUserPrivilegesToUserEntity";
m_log.DebugFormat("{0} . Convert the user privileges into the user entity object in order to save it in the DB", methodName);

var usersEntity = new List();

//Foreach user from the user privileges list
foreach (KeyValuePair user in updatedUsersPrivilegs)
{
//Make sure we're not working on Playback portal administrator
if (!user.Value.IsPlaybackPortalAdministrator)
{
var per = new List();
//For each site
foreach (var legacySite in user.Value.Permissions.Values)
{
var permissions = new List
();

if (legacySite.Permissions != null && legacySite.Permissions.Count > 0)
{
var permissionList = legacySite.Permissions.Values;

foreach (var permission in permissionList)
{
if (permission.IsApproved)
{
permissions.Add((Permissions) permission.ResourceId);
}
}
}

var sitePermissions = new SitePermissions
{
DbName = legacySite.DbName,
DbId = legacySite.DbId,
Permissions = permissions.ToArray()
};

per.Add(sitePermissions);

m_log.InfoFormat("{0} . Adding site permission to User ID {1} Site ID {2} Site Name {3} Version {4}",
methodName,
user.Key,
sitePermissions.DbId,
legacySite.DbName,
legacySite.Version == PBPVersion.Nim
? "Nim" : legacySite.Version == PBPVersion.NicePerform
? "Np" : "Cls");
}

var userEntity = new UserEntity{
UserId = user.Value.UserId,
UserName = user.Value.UserName,
NpSiteId = user.Value.NPSiteId,
IsFullAccessToAllLegacyDatabases = user.Value.IsPlaybackPortalAdministrator,
SitePermissions = per.ToArray()
};
usersEntity.Add(userEntity);
m_log.Debug(string.Format("{0} . {1}",methodName,PrintUserEntity(userEntity)));
}
}

m_log.DebugFormat("{0} . Leaving the method", methodName);
return usersEntity;
}

private List ConvertUserPrivilegesToUserEntityForSite(int dbId, Dictionary updatedUsersPrivilegs, List usersWithGroups, List usersWithoutGroups)
{
const string methodName = CLASS_NAME + ":" + "ConvertUserPrivilegesToUserEntity";
m_log.DebugFormat("{0} .  Convert the user privileges into the user entity object in order to save it in the DB", methodName);

var usersEntity = new List();

//Foreach user from the user privileges list
foreach (KeyValuePair user in updatedUsersPrivilegs)
{
//Make sure we're not working on Playback portal administrator
if (!user.Value.IsPlaybackPortalAdministrator)
{
var per = new List();
var canSeeTabResourceId = (int) Permissions.CanSeeTab;
var legacySite = user.Value.Permissions.FirstOrDefault().Value;
var permissionList = legacySite.Permissions;
var permissions = (from permission
in permissionList.Values.Where(p => p.ResourceId != canSeeTabResourceId)
where permission.IsApproved
select (Permissions) permission.ResourceId).ToList();

legacySite = user.Value.Permissions[dbId];
permissionList = legacySite.Permissions;

var originalCanSeeTab = permissionList.ContainsKey(canSeeTabResourceId)
&& permissionList[canSeeTabResourceId].IsApproved;
var toAssignCanSeeTab = (originalCanSeeTab && !usersWithoutGroups.Contains(user.Key))
|| usersWithGroups.Contains(user.Key);
if (toAssignCanSeeTab)
{
permissions.Add(Permissions.CanSeeTab);
}

SitePermissions sitePermissions = new SitePermissions
{
DbId = legacySite.DbId,
Permissions = permissions.ToArray()
};

per.Add(sitePermissions);
m_log.InfoFormat("{0} . Adding site permission to User ID {1} Site ID {2} Site Name {3} Version {4}",
methodName,
user.Key,
sitePermissions.DbId,
legacySite.DbName,
legacySite.Version == PBPVersion.Nim
? "Nim" : legacySite.Version == PBPVersion.NicePerform
? "Np" : "Cls");

var userEntity = new UserEntity
{
UserId = user.Value.UserId,
UserName = user.Value.UserName,
NpSiteId = user.Value.NPSiteId,
IsFullAccessToAllLegacyDatabases = user.Value.IsPlaybackPortalAdministrator,
SitePermissions = per.ToArray()
};
usersEntity.Add(userEntity);
m_log.Debug(string.Format("{0} . {1}", methodName, PrintUserEntity(userEntity)));
}
}

m_log.DebugFormat("{0} . Leaving the method", methodName);
return usersEntity;
}

#endregion
}
В настоящее время у нас около 5000+ пользователей и существует 5 миллионов записей привилегий. Метод ResolvePrivileges() обрабатывает 5 миллионов записей, и его выполнение заняло около 6000 мс. Я попытался преломить этот метод в своем цикле Parrallel.Foreach, но его выполнение заняло около 4500 мс. Я попытался объединить все 3 метода LoadNimUsersWithPrivilegesToPlaybackPortal(), CreateUserPrivilegesObjects(), ResolvePrivileges() в процедуру хранилища, но есть 2 системы, размещенные на разных сервер, поэтому это невозможно, поскольку это единственный способ добраться до него с помощью WCF, поэтому этот вариант также невозможен. Только ResolvePrivileges() напрямую имеет дело с базой данных, находящейся под моим контролем. Я подумываю о преобразовании Dictionalty "Dictionalusers" в json или xml и пытаюсь работать из процедуры хранилища. Если можете, предложите идею получше.

Подробнее здесь: https://stackoverflow.com/questions/790 ... rp-methods
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»