IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[Optimisation C++] Calcul code altitude


Sujet :

C++

  1. #1
    Membre �m�rite
    Avatar de Spout
    Profil pro
    Ing�nieur syst�mes et r�seaux
    Inscrit en
    F�vrier 2007
    Messages
    904
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France, Val d'Oise (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur syst�mes et r�seaux

    Informations forums :
    Inscription : F�vrier 2007
    Messages : 904
    Par d�faut [Optimisation C++] Calcul code altitude
    Bonjour � tous,

    Je viens de faire un bout de code calculant les codes de Gray utilis�s en aviation (infos sur le codage de Gray ici, infos sur le codage "Mode C" (altitude) ici et les diff�rents codes obtenus ici).
    Peu importe si vous ne comprenez pas le but, seule m'int�resse ici la mani�re dont il est obtenu.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    unsigned short Code_Mask = 0x0FFF;
    unsigned short tab[1280];
     
    unsigned short i=0;
    unsigned short j=0;
    // Parcours des 2^12 valeurs possibles pour les codes, mais on ajoute dans le tableau seulement les valeurs autorisées
    while(i<4096)
    {
    	// Calcul du code de Gray à partir du code binaire
    	unsigned short N = i;
    	unsigned short N2 = (i << 1) & Code_Mask;
    	unsigned short Gray = (N ^ N2) >> 1;
     
    	bool D1 = (Gray & 0x0800);		// D1 = 1?
    	unsigned short c = (Gray & 0x0007);							
    	if((c != 0) && (c != 5) && (c != 7) && !D1)	// Valeurs interdites de C + D1 doit toujours être 0
    	{
                    // On obtient alors DABC
    		tab[j] = Gray & 0x07FF;
    		if(j<1280)
    			j++;
    		else 
    			break;
    	}
    	i++;
    }
     
    // Inversion des poids des bits 1 et 4 de chaque digit
    for(unsigned int k=0; k<1280;k++)
    {
    	bool C4 = tab[k] & 0x0001; 
    	bool C1 = tab[k] & 0x0004;
    	if(C4)
    		tab[k] |= 0x0004;
    	else
    		tab[k] &= 0x0FFB;
    	if(C1)
    		tab[k] |= 0x0001;
    	else
    		tab[k] &= 0x0FFE;
     
    	bool B4 = tab[k] & 0x0008; 
    	bool B1 = tab[k] & 0x0020;
    	if(B4)
    		tab[k] |= 0x0020;
    	else
    		tab[k] &= 0x0FDF;
    	if(B1)
    		tab[k] |= 0x0008;
    	else
    		tab[k] &= 0x0FF7;
     
    	bool A4 = tab[k] & 0x0040; 
    	bool A1 = tab[k] & 0x0100;
    	if(A4)
    		tab[k] |= 0x0100;
    	else
    		tab[k] &= 0x0EFF;
    	if(A1)
    		tab[k] |= 0x0040;
    	else
    		tab[k] &= 0x0FBF;
     
    	// Rappel : D1 doit être 0
    	bool D4 = tab[k] & 0x0200;
    	if(D4)
    		tab[k] |= 0x0800;
    	else
    		tab[k] &= 0x07FF;
     
    	tab[k] &= 0x0DFF;
     
    }
     
    // Association de l'altitude au code correspondant
    // Note : tPair est une paire de deux paires de int pour les digits (A,B) et (C,D) du code d'altitude
    std::map<int,tPair> mapCode; 
    int altitude = -1200;				// -1200 est la première valeur d'altitude, puis évolue de 100 en 100
    for(unsigned int p=0; p<1280;p++)
    {
    	int A = (tab[p] & 0x01C0) >> 6;
    	int B = (tab[p] & 0x0038) >> 3;
    	int C = (tab[p] & 0x0007);
    	int D = (tab[p] & 0x0E00) >> 9;
     
    	mapCode.insert(std::make_pair(altitude,std::make_pair(std::make_pair(A,B),std::make_pair(C,D))));
    	altitude += 100;
    }
    N'�tant pas une star du C++, je cherche � optimiser ce bout de code. Donc n'h�sitez pas � vous d�cha�ner si vous voyez des choses qui vous choquent carr�ment ou qui pourraient �tre am�lior�es.
    Je suis toute ou�e, en vous remerciant d'avance

  2. #2
    R�dacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en s�curit�
    Inscrit en
    Mai 2007
    Messages
    11 517
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Consultant en s�curit�
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par d�faut
    Pourquoi est ce que tu cherches � optimiser ton code ?
    * Parce qu'il n'est pas assez rapide ?
    * Parce qu'il n'est pas assez concis ?

    Si ton probl�me est uniquement un probl�me de concision, je ne pense pas qu'il faille y toucher car tu risque de le rendre incompr�hensible.

    Dans l'�tat actuel, il est parfaitement lisible (m�me si je ne comprends pas ce que tu y fais car ce sont des donn�es que je ne comprends pas pas)
    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
    .

  3. #3
    yan
    yan est d�connect�
    R�dacteur
    Avatar de yan
    Homme Profil pro
    Ing�nieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Ing�nieur expert
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par d�faut
    Salut.
    Pourquoi utiliser une map??? un vector sera plus rapide
    pour faire une pair de pair?? une structure sera s�rement plus simple � g�rer

  4. #4
    Membre �m�rite
    Avatar de Spout
    Profil pro
    Ing�nieur syst�mes et r�seaux
    Inscrit en
    F�vrier 2007
    Messages
    904
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France, Val d'Oise (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur syst�mes et r�seaux

    Informations forums :
    Inscription : F�vrier 2007
    Messages : 904
    Par d�faut
    Citation Envoy� par ram_0000
    Pourquoi est ce que tu cherches � optimiser ton code ?
    * Parce qu'il n'est pas assez rapide ?
    * Parce qu'il n'est pas assez concis ?
    J'ai fait �a en un jet un peu � la va-vite. Je n'ai pas de probl�mes de rapidit�, c'est juste que je pense qu'il doit y avoir moyen de ne pas perdre de temps inutile sur certaines actions (comme les boucles par exemple), mais je vois pas trop comment m'y prendre.
    Citation Envoy� par Mongaulois Voir le message
    Pourquoi utiliser une map??? un vector sera plus rapide
    pour faire une pair de pair?? une structure sera s�rement plus simple � g�rer
    J'utilise une map pour acc�der directement aux valeurs A, B, C et D en rentrant l'altitude en param�tre. Si j'utilise un vecteur, je perds cet acc�s direct non?
    Mais plut�t qu'une paire de paires pour stocker A, B, C et D, je suis d'accord, une structure devrait mieux faire l'affaire. Je vais faire �a.
    d'ores et d�j� pour ces commentaires!

  5. #5
    Membre exp�riment� Avatar de Kujara
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    262
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 262
    Par d�faut
    Le truc atroce au milieu avec des |= et des &= doit etre possible en genre 3 lignes avec un temporaire, des masques et des decalages.

    J'irai jeter un coup d'oeil ce soir, si j'ai le temps.

  6. #6
    yan
    yan est d�connect�
    R�dacteur
    Avatar de yan
    Homme Profil pro
    Ing�nieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Ing�nieur expert
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par d�faut
    Citation Envoy� par spoutspout Voir le message
    J'utilise une map pour acc�der directement aux valeurs A, B, C et D en rentrant l'altitude en param�tre. Si j'utilise un vecteur, je perds cet acc�s direct non?
    Non et rechercher l'altitude la plus proche est co�teuse.
    vu que tu as un min et un pas, un vector est plus adapter.
    en gros :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    gray convertAltitudeToGray(float altitude);
    {
    int id =(altitude - min)/pas +.5;
    return vect[id];
    }

  7. #7
    Membre exp�riment� Avatar de Kujara
    Profil pro
    Inscrit en
    D�cembre 2006
    Messages
    262
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : D�cembre 2006
    Messages : 262
    Par d�faut
    Ok, j'avais tort.

    4 lignes, pas 3

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    unsigned short l_temp = tab[k] & 0x0492;
    l_temp |= ( tab[k] & 0x0249 ) << 2;
    l_temp |= ( tab[k] & 0x0124 ) >> 2;
    tab[k] = l_temp;

  8. #8
    Membre �m�rite
    Avatar de Spout
    Profil pro
    Ing�nieur syst�mes et r�seaux
    Inscrit en
    F�vrier 2007
    Messages
    904
    D�tails du profil
    Informations personnelles :
    �ge : 40
    Localisation : France, Val d'Oise (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur syst�mes et r�seaux

    Informations forums :
    Inscription : F�vrier 2007
    Messages : 904
    Par d�faut
    Hey!! C'est pas du tout mal vos id�es! C'est exactement le genre de simplifications que je recherchais.
    Merci � Mongaulois pour le stockage et merci � Kujara pour les masques

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Optimisation de mon code ActionScript
    Par amnesias dans le forum Flash
    R�ponses: 9
    Dernier message: 01/04/2007, 22h04
  2. Optimisation d'un code !
    Par leserapheen dans le forum Pascal
    R�ponses: 20
    Dernier message: 09/03/2007, 14h00
  3. Optimiser un calcul avec parcours de recordset
    Par hugo69 dans le forum Access
    R�ponses: 28
    Dernier message: 12/06/2006, 10h37
  4. [MMX] Optimisation d'un code C++ -> plus lent
    Par Laurent Gomila dans le forum x86 32-bits / 64-bits
    R�ponses: 12
    Dernier message: 17/05/2006, 18h47
  5. [Optimisation][Fonction]calcul du nombre de jours ...
    Par m-mas dans le forum MS SQL Server
    R�ponses: 6
    Dernier message: 26/10/2005, 14h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo