2009-10-09 7 views
3

Existe-t-il une raison pour laquelle des opérations mathématiques identiques prennent beaucoup plus de temps dans une application Silverlight que dans une autre?silverlight math performance question

Par exemple, j'ai un code qui prend une liste de points et les transforme (échelles et les traduit) et renseigne une autre liste de points. Il est important de garder les points d'origine intacts, d'où la deuxième liste.

Voici le code correspondant (échelle est un double et d'origine est un point):

public Point transformPoint(Point point) { 
     // scale, then translate the x 
     point.X = (point.X - origin.X) * scale; 
     // scale, then translate the y 
     point.Y = (point.Y - origin.Y) * scale; 
     // return the point 
     return point; 
    } 

Voilà comment je fais la boucle et le calendrier, au cas où il est important:

  DateTime startTime = DateTime.Now; 
     foreach (Point point in rawPoints) transformedPoints.Add(transformPoint(point)); 
     Debug.Print("ASPX milliseconds: {0}", (DateTime.Now - startTime).Milliseconds); 

Sur une série de 14356 points (ne demandez pas, il est modélisé un nombre réel dans l'application de bureau), la répartition est la suivante:

Silverlight app # 1: 46 ms

Silverlight app n ° 2: 859 ms

La première application est une application par ailleurs vide qui effectue la boucle dans le constructeur MainPage. Le second fait la boucle dans une méthode dans une autre classe, et la méthode est appelée au cours d'un gestionnaire d'événements dans le thread graphique, je pense. Mais cela devrait-il être important, étant donné que des opérations identiques se déroulent dans la boucle elle-même?

Il peut-être quelque chose d'énorme qui me manque dans la façon dont fonctionne le filetage ou quelque chose, mais cet écart n'a pas de sens pour moi du tout.

+3

Veuillez utiliser System.Diagnostics.StopWatch pour référencer votre code et afficher les résultats. L'utilisation de DataTime est très imprécise. – ParmesanCodice

+3

Aussi - et c'est peut-être évident - assurez-vous de mesurer la version Release dans les deux cas. –

Répondre

2

Outre les autres commentaires et réponses que je vais lire entre les lignes un peu.

Dans la première application que vous avez à peu près ce code dans l'isolement en cours d'exécution dans le constructeur MainPage. IWO vous avez créé une nouvelle application Silverlight et vous avez tapé ce code et c'est tout.

Dans la deuxième application, vous avez plus de choses réelles du monde réel. À tout le moins, vous avez ce code en cours d'exécution à la suite d'un clic sur une interface utilisateur rudimentaire. Là réside l'indice.

Prenez une application vierge et déposez un bouton dessus. Lancez-le et cliquez sur le bouton, que fait le bouton? Il y a des animations attachées aux états visuels du bouton.Cette animation (ou d'autres animations ou boucles) fonctionne probablement en parallèle avec votre code lorsque vous cliquez sur le bouton. Les temporisateurs (que vous le fassiez correctement avec StopWatch ou non) enregistrent le temps écoulé, pas seulement le temps que prend votre thread. Par conséquent, lorsque d'autres threads font d'autres choses (comme des animations), votre timing sera désactivé.

+0

C'est ce que je soupçonnais d'être le cas. Le travail effectué par un autre composant ou un autre thread ralentit mes opérations mathématiques. Le seul autre contrôle sur la page est une carte ESRI Silverlight qui réagit également aux mouvements de la souris qui provoquent le re-dessin de mes points. Mais les ordinateurs sont * vraiment * rapides - quoi que ce soit en train de faire, ça ne devrait pas faire perdre autant de temps au processeur que ça fait que des opérations mathématiques assez simples se font comme si elles étaient ... – Klay

1

Ma première suspicion serait que Silverlight App # 2 déclenche un garbage collection. Mise à l'échelle ~ 15 000 points devraient prendre une milliseconde, pas près d'une seconde. Essayez de réduire les allocations de mémoire dans votre code. TransformerPoints peut-il être un tableau plutôt qu'une structure de données développée dynamiquement?

Vous pouvez également regarder le GC performance counters, mais en réduisant simplement l'allocation de mémoire peut se révéler plus simple.

+0

À l'origine, lorsque j'ai créé la liste rawPoints, j'ai également ajouté chaque point à la liste transformPoints, afin qu'ils soient toujours de la même taille et qu'il n'y ait pas d'allocation de mémoire au cours de l'exécution du programme. Pour autant que je sache, il n'y a pas de différence de performance entre les tableaux et les listes si la taille de la liste ne change jamais. – Klay

+0

En outre, cela ne donne aucune indication de la raison pour laquelle les deux applications fonctionneraient si différemment. – Klay

0

Serait-il possible votre code n'est pas inline dans le CLR par l'application qui est en cours d'exécution plus lent?

Je ne sais pas comment le CLR gère SL inline, mais voici un lien vers quelques-unes des conditions préalables pour inline à 3.5 SP1.

http://udooz.net/blog/2009/04/clr-improvements-in-net-35-sp1/