|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Nouveau Membre du Club
![]() Inscription : mars 2009 Messages : 43 ![]() |
Bonjour, à tous !
Mes connaissances en programmation se limitant à ce que j'ai pu apprendre lors de ma scolarité, j'espère ne choquer personne avec mes questions ^^ !. J'éspère aussi poster au bon endroit Voila je vous explique mon problème, j'ai écrit un petit bout de code maladroit qui mélange C et C++ (cela doit être affreux pour un programmeur confirmé mais le résultat est fonctionnel) qui a mon gout prend beaucoup de temps pour s'exécuter. Le but de ce programme est de lire un fichier binaire qui contient un enregistrement de la communication numérique (ARINC) d'un équipement aéronautique. Pour lire le fichier binaire pas de soucis cela se fait assez rapidement, le problème se situe au niveau du décodage des trames ARINC enregistrées, opération qui prend le plus de temps dans mon code. Le fichier binaire contient en fait des succession de paquets de 9 octets : 5 octets contenant une info temporelle et 4 octets contenant le mot ARINC reçu. Pour ce faire je lis l'ensemble des paquets de 9 octets et je les stockent un à un dans une liste chainée que je parcours ensuite pour les décoder, le résultats du décodage est stocké a son tour dans une structure qui est elle même stockée dans une autre liste chainée de structure ( Le decodage consiste pour les 4 octets du mot ARINC a decomposer les 32 bits en différente parties pour obtenir les informations qu'il contient.Pour ce qui est de l'info temporelle les 5 octects contiennent sous forme binaire Heures;Minutes;Secondes et Microsecondes (8 bits pour les H, 6 pour les minutes, 6 pour les secondes et 20 pour les µsecondes) Pour l'instant je me débrouille avec des divisions et des soustractions pour extraire les parties désirées du mot ou de l'info temporelle. De plus j'ai besoins d'afficher l'info temporelle sous la forme seconde.µsecondes ( H*3600+60*M+S+(µS/1000000)), ce calcul doit etre gourmand en temps je pense. Ce projet étant lié a mon travail, je ne peut pas tout le temps rentrer dans le détail. Ma question se limite au problème de temps de calcul pour décoder les mots, si quelqu'un à une idée je lui en serait très reconnaissant. Je peut donner plus d'infos dans un message privé (surtout que tout cela doit vous paraitre brouillon mais j'ai du mal à tout expliquer de manière succincte) et même vous fournir mon code si cela peut aider. D'avance merci |
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Raymond Inscription : mai 2007 Messages : 9 021 ![]() |
Tu stockes tes enregistrements bruts de 9 octets dans une liste chainée ==> OK
Par contre, je ne vois pas l'intérêt de stocker le résultat du décodage dans une autre liste chainée. Cela t'oblige à décoder tous tes enregistrements bruts (effectivement, si tu en as beaucoup, cela peut prendre du temps) et surtout à stocker en mémoire une intreprétation de ce que tu as déjà. De plus, même si tu n'est pas intéressé par les 100 premiers (ou derniers, peut importe) enregistrements, tu calcule quand même leur représentation et tu stockes cette représentation en mémoire, quel gachis (je trouve). Pourquoi ne pas calculer l'interprétation de ces résultats bruts que lorsque tu en as réellement besoin et ce n'est même pas la peine de la sauvegarder car d'après ce que tu montres, le temps de recalcul semble très rapide. Dans le calcul que tu as décrit, il n'y a rien de long (sauf si c'est répété quelques milliers de fois pour rien
__________________
Raymond Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi ![]() Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.e-verbe Un logiciel de conjugaison des verbes de la langue française.Ma page personnelle sur DVP. |
|
|
00
|
|
|
#3 |
|
Nouveau Membre du Club
![]() Inscription : mars 2009 Messages : 43 ![]() |
En fait je n'ai pas tout dit
Je me sert aussi de la STL pour avoir des outil de comparaison entre listes pour faire les tests. Certes le calcul cité ne doit pas être long mais pour certain enregistrements le nombre de mots reçu est important, par exemple pour 5 minutes on peut atteindre 900000 mots ! J'ai aussi essayé la méthode lecture->décodage->stockage dans une même boucle mais le résultats est identique au niveau timing |
|
|
00
|
|
|
#4 |
|
Membre confirmé
![]() Inscription : juin 2008 Messages : 241 ![]() |
Bonsoir,
La lecture du fichier peut être longue si tu fait des lectures successive de 9 octets par 9 octets, sans buffer. Si c'est ce que tu fait, essai avec un filebuf, sinon ben j'ai pas d'autre idée... |
|
|
00
|
|
|
#5 |
|
Nouveau Membre du Club
![]() Inscription : mars 2009 Messages : 43 ![]() |
La lecture du fichier est deja "bufferisée" et est deja très rapide ! c'est l'enchainement des décodages qui est la plus longue (peut etre n'existe t il pas de solution
|
|
|
00
|
|
|
#6 | ||
![]() ![]() Inscription : juin 2008 Messages : 7 631 ![]() |
Bonjour,
As-tu fais un bench pour voir exactement quelles étaient les étapes les plus gourmandes ? Sinon toute recherche d'optimisation peut te faire aller dans des directions peu rentables ou contre-productives... Dans ce que je comprend de ton exposé : 1/ Lecture du fichier: OK 2/ Pour tout mes enregistrement : 2.1 Decoder Enregistrement 2.1.1 Decoder Temps 2.1.2 Decoder Mot 2.2 Ajouter à la liste des Enregistrements décodées. Qu'est-ce qui est gourmand : 2.1.1, 2.1.2 ou 2.2 ou tous ? Citation:
Citation:
|
||
|
|
00
|
|
|
#7 | ||
|
Nouveau Membre du Club
![]() Inscription : mars 2009 Messages : 43 ![]() |
Citation:
Des décalages, par exemple pour le calcul des minutes et des secondes qui sont codées sur 6 bits et donc deux octets: Les 6 bits de poids fort de l'o1 représentent les minutes, les deux bits de poids faible de l'o1 et les 4 bits de poids fort de l'o2 représentent les secondes. Les calcul est le suivant: minutes=o1>>2; secondes=o2>>4; secondes=secondes+(o1-4*minutes)*16; Citation:
|
||
|
|
00
|
|
|
#8 |
![]() ![]() Inscription : juin 2008 Messages : 7 631 ![]() |
Peux-tu poster juste ce bout de code ?
|
|
|
00
|
|
|
#9 |
|
Nouveau Membre du Club
![]() Inscription : mars 2009 Messages : 43 ![]() |
A priori pas de soucis pour présenter cette partie de mon code (voir en piece jointe, attention les yeux ^^ !)
Pardonnez aussi mon impolitesse mais j'ai oubliè de vous remercier pour vos réponses et votre réactivité< !
|
|
|
00
|
|
|
#10 |
![]() ![]() Inscription : juin 2008 Messages : 7 631 ![]() |
La première remarque qui me saute aux yeux - l'impact en perf n'est peut-être pas significatif mais.. - : pourquoi allouer sur le tas x et word et non pas les définir sur la pile ? A moins qu'il n'y a récursion ou que info soit très très grosse (et à ce moment que pour x), je ne vois pas l'intérêt.
Peux-tu fournir la définition de info ? |
|
|
00
|
|
|
#11 | ||
|
Nouveau Membre du Club
![]() Inscription : mars 2009 Messages : 43 ![]() |
Voici la structure info:
Code :
|
||
|
|
00
|
|
|
#12 |
![]() ![]() Inscription : juin 2008 Messages : 7 631 ![]() |
puiss(256,2) == 256*256 ?
|
|
|
00
|
|
|
#13 |
|
Nouveau Membre du Club
![]() Inscription : mars 2009 Messages : 43 ![]() |
|
|
|
00
|
|
|
#14 | ||||||||||||||||
![]() ![]() Inscription : juin 2008 Messages : 7 631 ![]() |
Tes variables ont des noms affreux
![]() En revanche, tu utilises la STL ; ca fera - de question à se poser.Passons au cœur des choses : En préambule, je ne te garantie pas que tout va améliorer la chose, mais à tester pour voir les impacts. 1/ Enlever les allocations dynamiques : Code :
Code :
4/ Je crois que les stringstream ne sont pas très performant. On va remplacer ça : Code :
On va se servir du compilateur pour nous générer une transformation bien plus efficace en utilisant les principes de la méta-programmation (on aurait peut être pu utiliser boost, mais je ne sais pas si tu l'utilises): On commence par définir une méta-fonction qui nous fait tout le calcul (j'ai pas réfléchie au pb LSB/MSB, je te laisse le soin de vérifier) : (tu as besoin d'inclure #include <climits> pour CHAR_BIT) Code :
Code :
Code :
![]() Code :
Code :
On remplace Code :
usec=(word[6]-16*sec)*puiss(256,2)+word[5]*puiss(256,1)+word[4]; // Calcul des µsec Code :
usec=(word[6]&0x0F)*256*256+word[5]*256)+word[4]; // Calcul des µsec 6/ De la même façon, on peut remplacer Code :
sec=sec+(word[7]-4*m)*16; //Calcul des secondes Code :
sec=sec+(word[7]&0x03)*16; //Calcul des secondes [EDIT] ci-joint ton fichier remanié. Il te reste encore un peu de boulot pour vérifier le tout |
||||||||||||||||
|
|
00
|
|
|
#15 | ||||
|
Nouveau Membre du Club
![]() Inscription : mars 2009 Messages : 43 ![]() |
merci pour toutes ces réponses, je vais étudier ça ce soir à la maison (au boulot je suis pas mal pris par d'autres choses et je me débrouille avec mon programme tel quel).Pour les deux fonctions wordcopy_2 et test_par en voici le détail: Code :
Code :
Derniere question, si j'ai bien compris [word[3]-128*par] est équivalent à [word[3]&0x7F] ? |
||||
|
|
00
|
|
|
#16 | |||||
![]() ![]() Inscription : juin 2008 Messages : 7 631 ![]() |
Sauf erreur de recopie, tu as un bug dans tes fonctions wordcopy : i va jusqu'à 9 inclus alors que le tableau est de taille 9 (donc dernier adressable est [8]).
Jamais eu de plantage inexpliqué ?Citation:
Citation:
Citation:
(il m'avait échappé).
|
|||||
|
|
00
|
|
|
#17 | ||||
![]() ![]() Inscription : juin 2008 Messages : 7 631 ![]() |
Code :
Code :
|
||||
|
|
00
|
|
|
#18 | |
|
Nouveau Membre du Club
![]() Inscription : mars 2009 Messages : 43 ![]() |
Citation:
|
|
|
|
00
|
|
|
#19 |
![]() ![]() Inscription : juin 2008 Messages : 7 631 ![]() |
Tu as eu de la chance
|
|
|
00
|
|
|
#20 | |||||
|
Nouveau Membre du Club
![]() Inscription : mars 2009 Messages : 43 ![]() |
Citation:
Les parties en C++ ont été faite a partir de toutes mes recherches sur internet |
|||||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com