Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment optimiser l'utilisation du CPU et de la RAM

6 réponses
Avatar
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

6 réponses

Avatar
Zazar
Bonjour,

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 thread s
qui ont pour action d'aller lire une page web et de l'analyser.



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.

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 ?

Diminuez plutôt la priorité de votre process. La priorité des threa ds
est relative aux autres threads du même process.

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 plu s ) ?



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
Avatar
Bull
Bonjour,

Et tout d'abord, merci pour votre réponse.

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.




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.



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 ?

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 ?

Diminuez plutôt la priorité de votre process. La priorité des threads
est relative aux autres threads du même process.



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 ?

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 ) ?




Pour la RAM :
-> si vous utilisez des objets Disposable, n'oubliez pas d'appeler
leurs méthodes Dispose.



Ok, je vais faire ça. Faut-il aussi faire après un : "nomObjet =
nothing" ou est-ce inutile ?

-> 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,...



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
Avatar
Zazar
Bonjour,

Mais quelles sont les règles de base pour améliorer un algorithme ?



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).

Avez-vous un profiler gratuit à me conseiller ?


Faîtes une recherche dans ces newsgroup, ce sujet a déjà été ab ordé.

Comment baisser la priorité de mon process ?


Regardez du coté de la classe Process.

-> si vous utilisez des objets Disposable, n'oubliez pas d'appeler
leurs méthodes Dispose.




Ok, je vais faire ça. Faut-il aussi faire après un : "nomObjet =
nothing" ou est-ce inutile ?


Si nomObjet est une variable locale, ça ne sert à rien; sinon oui il
faut le faire.

-> 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,...




Un pool d'objet ? Faites-vous référence aux pools qui sont l'altern ative
aux threads (mais ne permettent pas ni de gérer la priorité, ni de
stopper ceux en cours) ?



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.

Par ailleurs, j'ai quelques autres questions plus précises au sujet d e
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 ?


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.

- 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 ?


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).

- J'ai créé une classe qui contient toutes les méthodes me permet tant
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 obj et
connection, etc. (qui est supprimé bien sûr après). Est-ce bien ?


Si vous faîtes des Dispose sur vos objets connection, c'est la bonne
méthode.

--
Zazar
Avatar
Bull
Bonjour,

Avez-vous un profiler gratuit à me conseiller ?



Faîtes une recherche dans ces newsgroup, ce sujet a déjà été abordé.



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 :-[

Comment baisser la priorité de mon process ?



Regardez du coté de la classe Process.



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 ?

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 à chaque 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é à instancier
de nombreux objets d'un même type, ça peut vous faire économiser des
ressources.



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
Avatar
Bull
>> 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 à chaque 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é à instancier
de nombreux objets d'un même type, ça peut vous faire économiser des
ressources.




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 ?



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
Avatar
Zazar
Bonjour,

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 :-(



Essayez groups.google.fr
J'aurais juste besoin d'un nom de profiler gratuit, c'est tout :-[



Par exemple :
http://www.microsoft.com/downloads/details.aspx?FamilyId†CE6052-D7F4- 4AEB-9B7A-94635BEEBDDA&displaylang=en


Ok, je l'ai trouvé. Je suppose donc que cela correspond à la priori té 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 ?


Ca a un intérêt si vos threads n'ont pas tous la même priorité. V ous
pouvez par exemple laisser au thread qui gère l'interface une priorité
normale et mettre les threads qui font le traitement à une priorité p lus
faible.


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 ?



C'est ça. Mais aprés rien ne vous empêche de créer votre propre p ool
d'objets. Mais encore une fois ceci n'a d'intérêt que si vous avez un
type d'objets réutilisables que vous instanciez de nombreuses fois.

--
Zazar