Comment optimiser l'utilisation du CPU et de la RAM
Le
Bull
Bonjour à tous,
J'aimerais optimiser l'optimiser notamment du CPU par mon application,
utilisant qui a très souvent des pics à 100%.
Pour info, ces pics apparaissent quand je lance simultannement 5 threads
qui ont pour action d'aller lire une page web et de l'analyser.
J'ai beau mettre la priorité des threads au plus bas, le CPU est
toujours à 100% pendant le traitement.
Comment éviter cela pour que les autres applications qui tournent ne
soit pas trop ralenties ?
Par ailleurs, quels conseils plus généraux me donneriez-vous pour
économiser la RAM (et/ou voir ce qui dans mon appli en utilise le plus ) ?
Merci d'avance pour vos réponses !
--
Cordialement,
Bull
J'aimerais optimiser l'optimiser notamment du CPU par mon application,
utilisant qui a très souvent des pics à 100%.
Pour info, ces pics apparaissent quand je lance simultannement 5 threads
qui ont pour action d'aller lire une page web et de l'analyser.
J'ai beau mettre la priorité des threads au plus bas, le CPU est
toujours à 100% pendant le traitement.
Comment éviter cela pour que les autres applications qui tournent ne
soit pas trop ralenties ?
Par ailleurs, quels conseils plus généraux me donneriez-vous pour
économiser la RAM (et/ou voir ce qui dans mon appli en utilise le plus ) ?
Merci d'avance pour vos réponses !
--
Cordialement,
Bull

Poser une question


A priori, c'est votre méthode d'analyse qui prend les ressources CPU.
Regardez dans un premier temps si vous pouvez améliorer l'algorithme,
puis dans un second temps, si c'est vraiment nécessaire, utilisez un
profiler pour voir quels sont les parties de votre code ont besoin
d'être améliorées.
> Comment éviter cela pour que les autres applications qui tournent ne
> soit pas trop ralenties ?
Diminuez plutôt la priorité de votre process. La priorité des threa ds
est relative aux autres threads du même process.
Pour la RAM :
-> si vous utilisez des objets Disposable, n'oubliez pas d'appeler leurs
méthodes Dispose.
-> pour le reste : regardez si vous pouvez utiliser des pools d'objets,
si vous pouvez diminuer votre nombre d'objets (le nombre d'appel à new) ,
si vous pouvez diminuer la taille de vos objets,...
Attention, ne vous fiez pas à la mémoire indiquée dans le gestionna ire
des tâches, consultez plutôt celle donnée par un profiler ou par de s
compteurs de performance.
--
Zazar
Et tout d'abord, merci pour votre réponse.
Mais quelles sont les règles de base pour améliorer un algorithme ?
Avez-vous un site web à ce sujet ?
Avez-vous un profiler gratuit à me conseiller ?
Comment fait-on cela ? J'ai une classe qui lance mon appli avec un :
Application.Run(New Form1)
Comment baisser la priorité de mon process ?
Ok, je vais faire ça. Faut-il aussi faire après un : "nomObjet =
nothing" ou est-ce inutile ?
Un pool d'objet ? Faites-vous référence aux pools qui sont l'alternative
aux threads (mais ne permettent pas ni de gérer la priorité, ni de
stopper ceux en cours) ?
Par ailleurs, j'ai quelques autres questions plus précises au sujet de
l'optimisation :
- j'ai lu dans une revue qu'il faut mieux remplacer les AND et OR par
des Andalso et OrElse. Y a-t-il d'autres petites astuces similaires ?
- Pour mes fenêtres enfants, qu'est ce qui est le mieux : les charger
avec la form principale et ne faire plus qu'un .showdialog ou ne les
charger / instancier que lorsque nécessaire ?
- J'ai créé une classe qui contient toutes les méthodes me permettant
d'interroger la base. Afin que je puisse librement exécuter plusieurs
commandes en même temps sur la base, je crée à chaque fois un objet
connection, etc. (qui est supprimé bien sûr après). Est-ce bien ?
Voila, si vous avez d'autres petites astuces, des liens sur
l'optimisation de code, cela m'intéresse :-)
Merci encore pour votre aide
--
Cordialement,
Bull
Ne pas réinventer la roue : regardez si quelqu'un n'a pas déjà fait ce
que vous cherchez à faire. Sinon, aprés je ne connais pas de méthod es
qui s'applique à tous les algorithmes, mais vous pouvez commencer par
regarder les calculs de complexité des algorithmes (consultez votre
moteur de recherche favori).
Faîtes une recherche dans ces newsgroup, ce sujet a déjà été ab ordé.
Regardez du coté de la classe Process.
Si nomObjet est une variable locale, ça ne sert à rien; sinon oui il
faut le faire.
Un pool ça sert à réutiliser des objets. Ca peut être des threads ou
autre chose. L'intérêt étant de ne pas recréer un objet à chaqu e fois
qu'on en a besoin mais d'essayer d'en utiliser un dont on s'est déjà
servi. Si au cours de votre traitement, vous êtes amené à instancie r de
nombreux objets d'un même type, ça peut vous faire économiser des
ressources.
C'est de la microoptimisation. Ca fait gagner quelques cycles, mais en
général ce n'est pas là qu'on va gagner réellement en performance . Ca ne
se fait qu'en dernier recours quand tout le reste est déjà optimal.
Ca ne va pas changer grand chose :
1) Ca ne fait que déplacer le problème
2) Je suppose que vous n'ouvrez pas et fermez pas 60000 fenêtres.
Concentrez vos efforts sur la partie de votre code qui est lente. (Je
suppose que c'est l'analyse des pages web, mais il n'y a que vous qui
pouviez le déterminer : utilisez un profiler si besoin est).
Si vous faîtes des Dispose sur vos objets connection, c'est la bonne
méthode.
--
Zazar
J'en ai fait une mais ça ne trouve rien avec "profiler". Il faut dire
qu'avec thunderbird, on ne peut faire une recherche dans les messages
que dans le sujet et non les corps des news :-(
J'aurais juste besoin d'un nom de profiler gratuit, c'est tout :-[
Ok, je l'ai trouvé. Je suppose donc que cela correspond à la priorité de
l'application. Maintenant, rien en m'empêche d'affecter aussi à mes
threads une priorité plus basse n'est-ce pas ? Ou cela n'a-t-il aucun
intérêt ?
Ah, si j'ai bien compris, on ne peut utiliser un pool d'objet qu'avec
certains objets. Tous les objets n'ont pas de pool d'objet associé n'est
ce pas ?
Merci encore pour votre aide
--
Cordialement,
Bull
Bon apparement, j'ai mal compris puisque je viens de trouver une classe
qui permet de faire un pool de n'importe quel objet :
http://abstractvb.com/code.asp?A95
Par contre, je ne comprends pas du tout comment l'utiliser... par
exemple pour un objet connection, comment doit-on faire ?
Merci
--
Cordialement,
Bull