Question

J'utilise Redgate performances profileur pour tester mon asp.net mvc 2 application. L'une des choses que j'ai découvert était le XMLSerializer prenait trop de temps CPU si référence ce poste . Je l'ai changé à l'endroit où il utilise XmlSerializerCache maintenant.

Maintenant, la question est XmlSerializer pas plus là et je profilage l'application en simulant 80 utilisateurs en même temps en utilisant le site Web avec Jmeter. Alors maintenant, les méthodes de haut qui prennent du temps font un FirstOrDefault() sur certaines données que je tirais je donnerai exemple-

var values=(from c in DataContext.Table1
           join s in DataContext.Table2 on new { c.Id, c.date } 
            equals new { s.Id, s.date } into list
                          where c.Id== Id && c.date == date
                          from s in list.DefaultIfEmpty()
                          select new DayDTO()
                          {
                              Points = c.points,
                              Points1 = c.points1,
                              Points2 = c.points2,
                              Points3 = c.points3,
                              Points4 = c.points4
                          }).FirstOrDefault();

Quelqu'un peut-il me suggérer ce que je peux faire pour améliorer cela? Les temps actuels sont 25 secondes et 16 secondes pour les 2 premières méthodes .. Est-ce juste parce que je suis simulant 80 utilisateur en même temps et il y a des problèmes sur la base de données (serveur SQL 2005) côté comme la table étant trop grande et l'indexation etc ... et je vais examiner cela, mais actuellement je suis en train de cerner les problèmes que vous voyez avec le code-à-dire des questions sur le côté C # ..

Je serais reconnaissant de tout merci d'aide!

Était-ce utile?

La solution

Cela suppose que le temps de haut est le « temps compris », pas le « temps exclusif ».

moyen de temps compris qu'il comprend un code appelé par la méthode, dans ce cas, le FirstOrDefault exécutera l'appel de la base de données. appels de base de données sont chers dans le contexte de la latence, mais le thread CPU est bloqué et ne pas utiliser la CPU en attendant l'appel de la base de données.

D'abord, vous devez vous demander si cela est un problème, il n'affecte considérablement le débit (en supposant que le serveur de base de données peut gérer la charge), mais la latence de vos appels.

Si cela est un problème dont vous avez besoin pour accélérer la requête SQL réelle. Vous devriez commencer profileur SQL, attrapez la question réelle, puis exécutez-le en studio de gestion SQL. Regardez le plan d'exécution pour voir si la requête est plus lente que prévu et essayer de comprendre pourquoi. S'il est trop lent, vous pouvez vérifier votre indexation pour commencer.

Autres conseils

FirstOrDefault est probablement appelé comme le coupable simplement parce qu'il est la méthode qui force l'énumération dans votre cas. Si vous avez jeté dans un .ToList () avant, vous pouvez trouver le changement de fardeau pour .ToList ().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top