11
votes

Quelles sont quelques performances [DOS / NEUVANT] en C # -asp.net

Je finale l'un de mes projets et je examine l'ensemble du projet à la recherche d'erreurs, de bugs et d'erreurs de performance. J'utilise mvc. J'ai attrapé un seul et c'est comme suit:

Ne mettez jamais de rendu partout dans une boucle. Cela ralentira considérablement votre serveur entier.


1 commentaires

La chose à propos de RenderPartial est de manière significative plus vrai en mode de débogage qu'en mode de sortie. En mode de débogage, les frais généraux sont écrasés, car il sonde pour l'ASCX sur chaque itération. En mode de sortie, il est mis en cache, il n'est donc généralement pas mauvais du tout.


11 Réponses :


5
votes

Avez-vous exécuté votre programme via FXCop? Il a un ensemble de règles pour la performance.


0 commentaires

16
votes

jamais stocke une gamme WebControl à la session.

Parce qu'il a une référence à l'objet de la page, il finit par stocker chaque contrôle à la session.


2 commentaires

En outre, c'est un composant qui appartient à la page, donc si vous le stockez dans l'état de la session, puis essayez de l'utiliser dans une autre page, cela ne fonctionnera pas correctement. (Été là, fait ça ...) :)


J'aimerais ajouter éviter l'état de la session ou un autre état mondial dans la mesure du possible. Pas tant pour la performance, mais pour la maintenabilité générale.



12
votes

Ne pas optimiser prématurément. :) Si le site n'est pas performant, profilez le code pour déterminer où passer votre temps.


0 commentaires

3
votes

Ne pas profiler ni juger de manière autrement de la performance dans la configuration du débogage. La configuration de débogage n'est pas destinée à être rapide et que vous pouvez effectuer des conclusions de performance qui sont erronées (comme l'idée que les vues partielles / contrôles utilisateur sont lentes; ceci est vrai dans la configuration de débogage mais non dans la configuration de la libération). Lorsque vous proférez de mesurer les performances, vous devez utiliser la configuration de version afin que vous puissiez voir où sont les problèmes réels.


1 commentaires

Très, très vrai. En outre, n'oubliez pas de publier en mode de sortie ;-)



-1
votes

Utilisez seulement Essayez / attrayez des blocs lorsque cela est nécessaire. Ils ralentissent votre application.

Modifier pour plus de clarté: Par "nécessaire", je veux dire, pour attraper des erreurs réelles.

Si vous pouvez écrire du code et être proactif pour vous assurer que l'erreur ne sera pas lancée le faire, car il sera plus performant que de laisser une exception Être jeté, puis la manipulation.

Ne pas utiliser d'exceptions pour contrôler le flux de programme. Je ne sais pas qui l'a dit d'abord, mais je me souviens de la phrase " Exceptions devrait être exceptionnelle! ". Ils devraient être pour les cas où des problèmes imprévus se produisent, des choses qui ne pouvaient pas être testées avant l'exécution de Code et les jeter.

Le pire exemple que je vois tout est souvent quelque chose sur ces lignes ... xxx


5 commentaires

Ceci est bien sûr une version spécifique de la règle la plus générale "seulement écrivez le code nécessaire; le code inutile ralentit votre demande". Simplifiez quelles lignes sont «inutiles» est la partie difficile.


Il n'y a qu'un coût quand une exception est réellement jetée. Un bloc de capture d'essai n'aura aucun impact sur votre code sur votre code.


Je suppose que cela devrait être davantage "seulement jeter des exceptions pour la manipulation des erreurs, jamais pour le flux d'applications valide commun, car jetant une exception coûte cher."


@Alex n'est pas seulement coûteux de lancer des exceptions pour un flux valide, il est également très illogique et difficile à comprendre à première vue. Une des choses que les gens ont tendance à négliger ;-)


Fantastique ... Clarifiez le sens, et il est toujours descendu sans explications ...



0
votes

en C #, les objets sont toujours créés avec de nouveau. Cela seul peut être un inconvénient dans une certaine perspective. Par exemple, si vous créez un objet à l'intérieur d'une boucle (ce qui signifie qu'un nouvel objet est créé pour chaque itération de la boucle), vous pouvez ralentir votre programme.

Object o = new Object();
for (int i = 0; i < 1000; ++i)
{
   //...
}


5 commentaires

C'est exactement le type d'optimisation de la performance que l'on devrait éviter que si cela s'avère être un problème. Très souvent, le code est juste rendu beaucoup plus complexe sans aucune amélioration de la performance. C ++ La gestion de la mémoire est une histoire complétée ...


Cela étant dit, la création d'objets est vraiment, vraiment bon marché. Ayende a profilé ceci: ayende.com/blog / Archive / 2008/02/27 / ...


@Erik: Si sa classe serait en fait en train de faire certaines opérations graves, il ne serait pas si pas cher;) @ Alex: Pour chaque nouveau il doit y avoir une part de suppression ... en C # le garbage collector effectue la suppression pour vous. Cela étant dit, si vous créez constamment et détruire des objets qui allouent beaucoup de mémoire ou le besoin de faire certains emplois ... eh bien, vous terminerez en obtenant un gâchis! Si vous comprenez C ++ vous comprendre.


"Pour chaque nouveau, il doit y avoir une suppression quelque part ...", mal. Collection de déchets Il repose sur des racines traversantes. Ne pas "supprimer" des objets inutilisés. Les efforts visant à compacter un tas de gérer et à les propager à une nouvelle génération dépendent du nombre d'objets encore enracinés ou pisent encore. La quantité d'objets mis au rebut est totalement non pertinente si elles n'ont pas besoin de finalisation. Et le terme scientifique pour "... eh bien vous finirez par avoir un gâchis!" est "fragmentation de la mémoire".


@Alex: Si les objets de C # ne sont pas supprimés, vous obtiendrez des fuites de mémoire ... Le collecteur des ordures supprime des objets. Le moteur d'optimisation du collectionneur des ordures détermine le meilleur moment pour effectuer une collection (les critères exacts sont gardés par Microsoft) en fonction des attributions effectuées. Lorsque le collecteur des ordures effectue une collection, il vérifie les objets du tas géré qui ne sont plus utilisés par l'application et exécute les opérations nécessaires pour récupérer leur mémoire.



1
votes

La plupart des problèmes de performance sont dus à l'accès au disque ou à des appels sur des réseaux.

Soyez donc prudent comment et la fréquence à laquelle vous accédez au système de fichiers ou à une base de données. Avez-vous besoin de faire autant d'appels sur le réseau ou pourriez-vous le faire dans un seul appel?

Un bon exemple:

  • la valeur est stockée dans la session La session
  • est configurée pour utiliser SQL Server La valeur
  • est utilisée uniquement une fois toutes les dix demandes
  • pour chaque demande La valeur sera lue dans la base de données, puis écrite dans la base de données

    Dans ce cas, une meilleure solution peut être être pour écrire le code personnalisé pour stocker et lire la valeur.


0 commentaires

2
votes

Ne plaisante pas avec une collection ordures explicite.


0 commentaires

1
votes

la mise en cache vous aiderait à améliorer la performance, mais vous devriez faire attention à l'utiliser uniquement là où il a du sens


0 commentaires


1
votes

Utilisez des méthodes statiques - mais uniquement si la méthode est fréquemment utilisée.

Ne marquez pas une variable en tant que statique, sauf si vous vraiment veux que la valeur de la variable soit identique à toutes les instances (un autre développeur a fait cela et je me suis amusé à déboguer pourquoi nous n'avons eu aucun comportement étrange lorsque plusieurs Les utilisateurs ont frappé le site). Ce n'est pas pour des raisons de performance, mais juste de bons conseils.


0 commentaires