OVH Cloud OVH Cloud

vitesse d'execution

14 réponses
Avatar
AG
Bonjour,

d'aucun prétendent que :

int * p = malloc(10*sizeof(*p));
int i;

for(i=0;i<10;i++)
{
*p++=0;
}
p-=10;

est plus rapide que :

int * p = malloc(10*sizeof(*p));
int i;

for(i=0;i<10;i++)
{
p[i]=0;
}

Ce que je sais c'est que la première solution est peu lisible est pas trés
naturelle. La deuxième me parait bien plus simple, et idiomatique. Qu'en
est-il niveau rapidité ? le compilo n'est-il pas capable d'optimiser tout
seul ce genre de boucle ?

AG.

4 réponses

1 2
Avatar
Antoine Leca
En news:dtutmm$abm$, AG va escriure:
d'aucun prétendent que :

for(i=0;i<10;i++) *p++=0;

est plus rapide que :

for(i=0;i<10;i++) p[i]=0;


C'est probable, en tous cas pour nous : comme nos claviers n'ont pas les
touches [ et ], il est clairement plus rapide de taper la première forme.

À part cela, je ne vois pas vraiment de différence (avec les compilos
actuels).
De toute manière, si ton programme est contraint en temps d'exécution au
niveau de l'initialisation, il y a probablement un problème de définition
des données....

Ce que je sais c'est que la première solution est peu lisible est pas
trés naturelle.


Euh, il va falloir d'habituer alors, c'est quand même très courant en C.

La deuxième me parait bien plus simple, et idiomatique.


L'idiomatisme en question est connu comme le syndrome Pascal...

le compilo n'est-il pas capable d'optimiser tout seul ce genre de
boucle ?


Si bien sûr, il va le réécrire en (pour 3 pipelines)
p[7]=p[3]=p[6]=p[2]=p[9]=p[5]=p[1]=p[8]=p[4]=p[0]=0;
(voire faire des groupés sur des doubles entiers ou utilisant 0f).

Un compilateur plus simplet va appliquer un schéma plus passe-partout et le
transformer en
{int zéro=0, *q=p, compteur=2;
goto début;
boucle:
*q++=zéro; *q++=zéro; *q++=zéro; *q++=zéro;
*q++=zéro; *q++=zéro;début:*q++=zéro; *q++=zéro;
if(--compteur)goto boucle;
}
qui sont certainement moins facile à lire pour un humain, mais clairement
équivalent pour un compilateur, et probablement plus proche du langage
machine cible.


Antoine

Avatar
Marc Boyer
Le 28-02-2006, Antoine Leca a écrit :
Ce que je sais c'est que la première solution est peu lisible est pas
trés naturelle.


Euh, il va falloir d'habituer alors, c'est quand même très courant en C.


Et les itérateurs de la STL sont en train de populariser la
notation en C++ (puisqu'on fera du it++ aussi pour parcourir
une liste chainée).

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exiter des sots
IF -- Rudyard Kipling


Avatar
Marc Boyer
Le 28-02-2006, paf le chien a écrit :
Marc Boyer a grommelé:
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exiter des sots
IF -- Rudyard Kipling


non, Paul Eluard :)
sinon, il faut signer:
If you can bear the words you've spoken
Twisted by knaves to make a trap for fools

il parle angliche Rudyard Kipling ;)

Et Eluard mérite bien d'être mentionné pour sa belle traduction


OK, c'est corrigé.


--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exiter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)


Avatar
Emmanuel Delahaye
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exiter des sots
IF -- Rudyard Kipling


non, Paul Eluard :)

sinon, il faut signer:
If you can bear the words you've spoken
Twisted by knaves to make a trap for fools

il parle angliche Rudyard Kipling ;)

Et Eluard mérite bien d'être mentionné pour sa belle traduction


Joli !

--
A+

Emmanuel Delahaye


1 2