|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Candidat au titre de Membre du Club
![]() khadidja tih Inscription : novembre 2010 Messages : 157 ![]() |
Salut !
J'essaye de calculer le temps d’exécution de l'algorithme de tri rapide, et un autre algo pour les recherche (linéaire, dichotomique...) mais le problème quand il s'agit de grand chiffre le programme plante, donc je cherche si il y a une solution pour minimiser la consommation. |
|
|
00
|
|
|
#2 | ||
![]() ![]() ![]() Idriss NeumannConsultant en SSII et auditeur au CNAM Paris (ingénieur SI) Inscription : février 2009 Messages : 3 796 ![]() |
Bonjour.
Déjà il serait pas mal de nous montrer ton code ainsi qu'un exemple de ce que tu appel "grand chiffre". Citation:
Citation:
Cordialement, Idriss |
||
|
00
|
|
|
#3 | ||
|
Candidat au titre de Membre du Club
![]() khadidja tih Inscription : novembre 2010 Messages : 157 ![]() |
Voici mon code
Code :
|
||
|
|
00
|
|
|
#4 |
|
Membre éclairé
![]() |
Je me suis arrêté là.
Change tes conditions, boucle infinie tu ne rentres pas dans ton else { return }
__________________
Kinaesthetic project
|
|
00
|
|
|
#5 | |
|
Expert Confirmé
![]() Inscription : septembre 2006 Messages : 2 375 ![]() |
Citation:
Une boucle infinie ne fait pas "planter" le programme : il ne se termine pas c'est tout, or ici cela plante si le paramètre > 100000, avec un programme qui fait appel à la récursion, le premier "usual suspect" est plutôt le manque d'espace sur le stack... |
|
|
|
00
|
|
|
#6 |
|
Candidat au titre de Membre du Club
![]() khadidja tih Inscription : novembre 2010 Messages : 157 ![]() |
Oui exactement c 'est le manque d'espace mais comment remédié ça ?
|
|
|
00
|
|
|
#7 |
|
Expert Confirmé
![]() Inscription : septembre 2006 Messages : 2 375 ![]() |
la taille du stack à allouer par le programme compilé est en général un paramètre de l'éditeur de lien (par exemple --stack) et la valeur maximum dépend de l'OS et de l'architecture 32/64 bits du binaire généré.
Sous certains environnements vous pouvez aussi changer la taille du stack avec setrlimit(RLIMIT_STACK, ...) au runtime. |
|
|
00
|
|
|
#8 |
|
Candidat au titre de Membre du Club
![]() khadidja tih Inscription : novembre 2010 Messages : 157 ![]() |
Je sais pas trop comment utiliser cette fonction tu peux me donner un coup de pouce stp
|
|
|
00
|
|
|
#9 | ||
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 717 ![]() |
http://man.developpez.com/man2/setrlimit.2.php pour utiliser cette fonction.
Il faut aussi veiller à limiter au maximum l'usage de la stack, notamment en déclarant des variables locales à chaque appel de la fonction récursive : Code :
Par contre, cette fonction lance deux fonctions (elle-même et fusion) qui travaillent sur la même partie du tableau : normal ? pas de risque de conflit ? De même, la fonction fusion définie énormément de variables locales qui encombrent la pile et qui sont peut être évitable. On alloue aussi de la mémoire à chaque itération, attention à la consommation. Une remarque globale : commentez votre code
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
||
|
00
|
|
|
#10 | ||||
|
Expert Confirmé Sénior
![]() ![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 498 ![]() |
Citation:
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
||||
|
|
10
|
|
|
#11 | |||
|
Expert Confirmé
![]() Inscription : septembre 2006 Messages : 2 375 ![]() |
Citation:
par contre dans fusion() il y a une optimisation simple à faire : se débarrasser du malloc/free en constatant que la taille maximum du buffer temporaire est connue dès le départ... donc allouer ce tableau temporaire une seule fois sera une grosse optimisation du temps d'exécution. l'autre optimisation est de constater que les 2 branches de la récursivité sont indépendantes et donc pourraient profiter d'un scheduling sur des cores différents du processeur (auquel cas il faudra 2 buffers temporaires pour la fusion...) à condition d'utiliser une librairie légère genre GCD si supportée par le compilateur utilisé. et évidemment arrêter la récursivité plus tôt : quand le nombre d'éléments (find - deb) est inférieur à un threshold pour lequel la récursivité coûte plus cher d'un algorithme trivial. |
|||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com