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 :

Accès le plus rapide: Pointeur ou tableau?


Sujet :

C

  1. #21
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Points : 542
    Points
    542
    Par défaut
    Citation Envoyé par homeostasie
    Pourrais je avoir un de ces cas à titre d'exemple que je me fasse une idée?
    L'assembleur est encore pas mal utilisé pour tout ce qui est traitement de signal en temps réel (video, son) parce que c'est un domaine qui se prête généralement bien à la parallélisation et l'utilisation d'instructions dédiées (genre SSE), ce qui est encore le point faible des compilateurs.

    Mais il faut quand même toujours garder à l'esprit que (bien) programmer en assembleur est très coûteux en temps (par rapport à des langages évolués) et donc généralement ... très coûteux tout court !

  2. #22
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Mais il faut quand même toujours garder à l'esprit que (bien) programmer en assembleur est très coûteux en temps (par rapport à des langages évolués) et donc généralement ... très coûteux tout court !
    C'est clair et merci pour ces précisions!

    De toute facon, la seule réponse valable sera sûrement :
    Citation:
    A tester. Lance 10000 fois les deux versions, regarde le temps sur différentes architectures et fait une synthése.
    J'ai donc fait les tests avec la fonction suivante où je lance d'abord 50000 fois la proposition 1 puis 50000fois la proposition 2:
    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
     
    void mesureTempsDebug(WIND_TCB *oldTcbPtr, WIND_TCB *newTcbPtr)
    {
      	REG_SET regSet;			/*Task registers*/
    	TASK_DESC taskDesc;		/*information structure */
    	tracePostMortem *TaskInfoTemp = NULL;
    	UInt32 tickDeb, tickFin, i;
     
    	taskLock();
    	tickSet(0);
    	tickDeb = tickGet();
    	for(i = 0; i < 50000; i++)
    	{
       	/*Critical section: temporay storage pointer to optimize the speed.*/
       	TaskInfoTemp = &TaskInfoBuf[indexBuf];
     
       	TaskInfoTemp->taskId = taskNameToId(oldTcbPtr->name);
       	if (taskRegsGet (TaskInfoBuf[indexBuf].taskId, &regSet) != ERROR){
       		TaskInfoTemp->registers = regSet;
       		TaskInfoTemp->TaskSP = (int)GetSP();
    		TaskInfoTemp->TaskFP = (int)GetFP(); 
       		TaskInfoTemp->TaskPrevFP = (UInt32)FP_FROM_STACK(regSet.spReg);
       	}
     
    	TaskInfoTemp->stackBase = (UInt32) oldTcbPtr->pStackBase;
    	TaskInfoTemp->stackLimit = (UInt32) oldTcbPtr->pStackLimit;
    	TaskInfoTemp->stackEnd = (UInt32) oldTcbPtr->pStackEnd;
     
       	if (taskInfoGet (TaskInfoTemp->taskId, &taskDesc ) != ERROR){
       		TaskInfoTemp->stackSize = taskDesc.td_stackSize;
       		TaskInfoTemp->stackCurrent = taskDesc.td_stackCurrent;
       		TaskInfoTemp->stackHigh = taskDesc.td_stackHigh;
       	}
    	}
    	tickFin = tickGet();
    	printf("Solution1: tickDeb = %d, tickFin = %d\n\n",tickDeb,tickFin);
     
       	tickSet(0);
    	tickDeb = tickGet();
       	for(i = 0; i < 50000; i++)
    	{
       	TaskInfoBuf[indexBuf].taskId = taskNameToId(oldTcbPtr->name);
       	if (taskRegsGet (TaskInfoBuf[indexBuf].taskId, &regSet) != ERROR){
       		TaskInfoBuf[indexBuf].registers = regSet;
       		TaskInfoBuf[indexBuf].TaskSP = (int)GetSP();
    		TaskInfoBuf[indexBuf].TaskFP = (int)GetFP(); 
       		TaskInfoBuf[indexBuf].TaskPrevFP = (UInt32)FP_FROM_STACK(regSet.spReg);
       	}
     
    	TaskInfoBuf[indexBuf].stackBase = (UInt32) oldTcbPtr->pStackBase;
    	TaskInfoBuf[indexBuf].stackLimit = (UInt32) oldTcbPtr->pStackLimit;
    	TaskInfoBuf[indexBuf].stackEnd = (UInt32) oldTcbPtr->pStackEnd;
     
       	if (taskInfoGet (TaskInfoBuf[indexBuf].taskId, &taskDesc ) != ERROR){
       		TaskInfoBuf[indexBuf].stackSize = taskDesc.td_stackSize;
       		TaskInfoBuf[indexBuf].stackCurrent = taskDesc.td_stackCurrent;
       		TaskInfoBuf[indexBuf].stackHigh = taskDesc.td_stackHigh;
       	}
    	}
       	tickFin = tickGet();
    	printf("Solution2: tickDeb = %d, tickFin = %d\n\n",tickDeb,tickFin);
       	taskUnlock();
    }
    Le résultat sur le shell est le suivant:
    -> mesureTempsDebug
    Solution1: tickDeb = 0, tickFin = 15

    Solution2: tickDeb = 0, tickFin = 15
    Je suis assez surpris car le temps d'éxécution est le même...Le compilateur ferait il vraiment très bien son travail!
    En conclusion, ca semble le cas.

    Le système est réglé pour 60ticks/s.
    Le temps d'éxécution d'un passage dans une des deux solutions est donc d'environ 5µs.

    Si vous avez des remarques vis à vis du résultat, n'hésitez pas!

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. la Recherche la Plus Rapide dans un tableau
    Par linuxeur dans le forum C
    Réponses: 10
    Dernier message: 23/05/2008, 00h07
  2. Mode d'accès le plus rapide ?
    Par QAYS dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/10/2007, 10h38
  3. Réponses: 15
    Dernier message: 05/09/2006, 16h10
  4. dans quels cas les pointeur sont plus rapides ?
    Par 180degrés dans le forum C++
    Réponses: 12
    Dernier message: 20/08/2005, 23h12
  5. Réponses: 8
    Dernier message: 31/10/2003, 16h21

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