Optimization de code pour du Xna rapide et efficace !

Je dois en omettre un grand nombre, si vous en avez d’autres n’hesitez pas à me les soumettre que je les rajoute ici !


Première optimisation, les strings :


Eviter tout indexeur à base de string s’il y’a un équivalent à base d’int.


L’instruction :


myEffect.Techniques[“Precompiled”] ;


Est bien moins efficace q’un :


const int TechnikIndex = 0;


myEffect.Technique[TechnikIndex]


Eviter au maximum la class string, si on a besoin de puissance. En C# tout modification d’une string entraine la création d’une nouvelle instance et donc une allocation mémoire. Une string N EST JAMAIS MODIFIABLE et l’allocation mémoire est une opération très couteuse en temps. Il faut donc travailler un maximum avec StringBuilder.


 Besoin de comprendre le string intern pool. Quand on créé une string, le clr regarde dans un pool interne si elle existe avant de la créer. (méthode statique Intern de la classe string).


Donc string jamais collectés comme les objets communs dans le GC.


 


 Boxing/unboxing


Boxing passage d’un value type (exemple int) à une classe objet .


Par exemple :


int a  = 0;


object o = (object)a;


Unboxing est l’opération inverse.


boxed = 20 fois plus de traitement CPU qu’une simple affectation de ref


unboxed = 4 fois plus


= généric autant que faire se peux (optimization en Early binding)


 Pour les struct, implementer la méthode ToString (sinon il y’a boxing en objet pour chaque appel à cette méthode)


 


Array


Jagged Arrays > Rectangular Array ([][] > [,])


Privilegier les for au foreach (moins nécessaire depuis le .Net 3.0)


addrange plutot que add


Range Check important, exemple :


//rapide
for(int i = 0; i < myArray.Length; i++)
{
   Console.WriteLine(myArray[ i ].ToString());
}
//plus lent
for(int i = 0; i < myArray.Length + y; i++)

   Console.WriteLine(myArray[ i+x ].ToString());
}


Dans la seconde boucle le test ne porte pas sur la longueur du tableau traité mais sur une autre valeur, il y’a donc des tests supplémentaire ajouté en IL pour générer une exception en cas de sortir de Bounds.



Methodes :


Il y’a quelque regles simples pour que le compilateur utilise de l’inlined (suppresion à la compilation d’une méthode pour inclure son code en lieu et place de l’instruction appellant la dite méthode) :


  • 32o d’il (8instructions) max par méthode/accesseur/mutateur à “inliner”
  • pas de structures conditionnelles dans le bloc à inliner
  • pas de type struct utilisé dans le bloc à inliner
  • pas de bloc Try/Catch/Finaly dans le bloc à inliner.

Si il n’y a pas besoin de rendre le code compréhensible on priviligiera les chunky call au maximum (méthodes énormes en lieu et place de myriades de petites méthodes qui s’appellent les unes les autres).


 


Thread


Synchroniser les thread : System.Threading.Interlocked class


 


 Exception


retourner des enum plutot que des exception sur les méthodes critiques


Eviter ce genre de code :


public static void Main(string[] args){
  int j = 0;
  for(int i = 0; i < 10000; i++){
    try{   
      j = i;
      throw new System.Exception();
    } catch {}
  }
}


En asp.net, à eviter :


L’instruction : Response.Redirect() elle provoque un ThreadAbortException


Un throw d’exception perturbe gravement l’activité CPU associée à votre applicatif.


 


Objets


Utiliser au maximum les structure là ou la notion de référence n’est pas importante (besoin ponctuelle d’agrégat ordonné de données) en lieu et place d’une class


(Exemple de la structure Point, Rectangle, etc.) . La gestion en mémoire est alors bien plus efficace et rapide.


Apprecier au maximum l’attribut Fieldoffset qui permet de réaliser l’équivalent de l’Union du langage C pour optimiser la mémoire


Utiliser les weakreference notamment pour le cache, afin de ne pas surcharger la mémoire.


 


 Framework :


Working Set : charger une assembly pour profiter d’une seule de ses méthodes c’est pas bien !


Utiliser vadump.exe pour détecter ca dans son framework


Se servir de Perfmon et de ses attributs (nb de classes chargées, nombre de méthodes, temps passé à loader, JITed, etc.)


 


 Executables :


Précompilation avec ngen.exe pour les exes critiques. Permet de précompiler son application pour un premier lancement rapide.


 


SQL 


connexion ouverte longtemps < multiple ouverture /fermeture de connexion


Datareader > dataset


Annuler le transaction enlistment si inutile


 SqlConnection conn = new SqlConnection(


“Server=exasrv01;


Integrated Security=true;


Enlist=false”);