OVH Cloud OVH Cloud

Optimisation

30 réponses
Avatar
DomiPi
Bonsoir à tous,
Pour optimiser la place en mémoire, j'ai toujours l'habitude de choisir les
variables les plus petites possibles.
par exemple

char i;
for(i=0;i<100;i++) {
etc...
}

Qu'en est il de l'optimisation sur les PC 32 bits actuels?
Est ce que i n'occupe réellement que un octet ?
Et si oui est ce que la vitesse d'exécution n'est pas pénalisée ?

Merci de vos réflexions

Dominique

10 réponses

1 2 3
Avatar
Alexandre Bacquart
Emmanuel Delahaye wrote:

In 'fr.comp.lang.c', Alexandre Bacquart wrote:


En mémoire, oui, mais au prix d'une réduction de la performance pour les
adresses impaires.


Equivalent à la lecture de 16 bits (int sur 68k). On économise la place,


Non. En 68000, les int font 32 bits. Les short font 16-bits.


Bizarre, j'ai commencé le C sur Atari ST et j'étais sûr que les int
faisaient 16 bits... peut-être en x86 alors... l'avais dis que ma
mémoire me jouait des tours...

De toute facon, cela ne fait que renforcer mon argument, puisque l'accès
à un 32 bits sur 68000 sera strictement 2 fois plus lent qu'un 8 bits
(plus lent qu'un 16 bits sur adresse paire seulement).

le temps d'accès est au pire égal à celui d'un int.


Pas sûr...


Ben maintenant encore plus, si :)


--
Tek



Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Alexandre Bacquart wrote:

En mémoire, oui, mais au prix d'une réduction de la performance pour les
adresses impaires.


Equivalent à la lecture de 16 bits (int sur 68k). On économise la place,


Non. En 68000, les int font 32 bits. Les short font 16-bits.


Bizarre, j'ai commencé le C sur Atari ST et j'étais sûr que les int
faisaient 16 bits... peut-être en x86 alors... l'avais dis que ma
mémoire me jouait des tours...


En fait, sur certains compilateurs (Microtec/ Mentor Graphics), c'est
réglable (c'est pratique...) 16 ou 32. Comme ça tout le monde est content!

De toute facon, cela ne fait que renforcer mon argument, puisque l'accès
à un 32 bits sur 68000 sera strictement 2 fois plus lent qu'un 8 bits
(plus lent qu'un 16 bits sur adresse paire seulement).

le temps d'accès est au pire égal à celui d'un int.


Pas sûr...


Ben maintenant encore plus, si :)


Un acces 32 bits n'est pas plus lent qu'autre chose sur une machine 32 bits.

Enfin, revenons au C...

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/




Avatar
Alexandre Bacquart
Emmanuel Delahaye wrote:

In 'fr.comp.lang.c', Alexandre Bacquart wrote:

Un acces 32 bits n'est pas plus lent qu'autre chose sur une machine 32 bits.

Enfin, revenons au C...


Oui, mais je ne peux pas te laisser dire ça. Un 68000 a un bus 16 bits.
Ta remarque n'est vraie que dans le cas des registres 32 bits.


--
Tek

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Alexandre Bacquart wrote:

Emmanuel Delahaye wrote:

In 'fr.comp.lang.c', Alexandre Bacquart wrote:

Un acces 32 bits n'est pas plus lent qu'autre chose sur une machine 32
bits.

Enfin, revenons au C...


Oui, mais je ne peux pas te laisser dire ça. Un 68000 a un bus 16 bits.


Oups, j'avais oublié ce détail... Ok, le bus de données externe est 16-bit,
mais il y a un bus interne 32-bits entre l'ALU et les registres, non?

Ta remarque n'est vraie que dans le cas des registres 32 bits.


Ah, ok.

--
-ed- get my email here: http://marreduspam.com/ad672570
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?libÉ9
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


Avatar
Alexandre Bacquart
Emmanuel Delahaye wrote:

In 'fr.comp.lang.c', Alexandre Bacquart wrote:

Oups, j'avais oublié ce détail... Ok, le bus de données externe est 16-bit,
mais il y a un bus interne 32-bits entre l'ALU et les registres, non?


Oui heureusement :) On dit aussi que le 68000 est un 16/32 bits.



--
Tek

Avatar
Manhattan
"DomiPi" a écrit dans le message de
news:40f5666e$0$62356$
Bonsoir à tous,
Pour optimiser la place en mémoire, j'ai toujours l'habitude de choisir
les

variables les plus petites possibles.
par exemple

char i;
for(i=0;i<100;i++) {
etc...
}

Qu'en est il de l'optimisation sur les PC 32 bits actuels?
Est ce que i n'occupe réellement que un octet ?
Et si oui est ce que la vitesse d'exécution n'est pas pénalisée ?

Merci de vos réflexions

Dominique




Pour ce qui est de la vitesse sur PC 32 bits, Intel recommande d'utiliser le
type entier sur 32 bits ou 8 bits, et déconseille les entiers sur 16 bits.
Une instruction manipulant une donnée sur 16 bits prend un octet de plus que
la même instruction travaillant sur 8 ou 32 bits. Elle est décodée moins
efficacement. Il vaut mieux utiliser des entiers sur 32 bits. En interne, le
processeur travaille sur des registres de 32 bits, même si l'instruction
manipule seulement 8 bits d'un registre.

Du point de vue de l'accès mémoire, accéder à 8 ou 32 bits est équivalent.
Dans les deux cas, le processeur lira dans le cache si la donnée s'y trouve,
ou chargera une ligne complète si elle n'y est pas.

Je dirais donc que pour les variables comme les compteurs ou autres, il vaut
mieux travailler sur 32 bits. Pour les grandes tables, il vaut mieux
utiliser le plus petit type pour optimiser le cache.

Avatar
DomiPi
Merci à tous
j'y vois un peu plus clair
Dominique


"DomiPi" a écrit dans le message de
news:40f5666e$0$62356$
Bonsoir à tous,
Pour optimiser la place en mémoire, j'ai toujours l'habitude de choisir
les

variables les plus petites possibles.
par exemple

char i;
for(i=0;i<100;i++) {
etc...
}

Qu'en est il de l'optimisation sur les PC 32 bits actuels?
Est ce que i n'occupe réellement que un octet ?
Et si oui est ce que la vitesse d'exécution n'est pas pénalisée ?

Merci de vos réflexions

Dominique




Avatar
Antoine Leca
En , Emmanuel Delahaye va
escriure:
In 'fr.comp.lang.c', Alexandre Bacquart wrote:

En mémoire, oui, mais au prix d'une réduction de la performance
pour les adresses impaires.


Equivalent à la lecture de 16 bits (int sur 68k). On économise la
place,


Non. En 68000, les int font 32 bits. Les short font 16-bits.


Non. Il y a deux "modèles" de processeur avec le 680x0: 16 bits ou 32 bits
(taille des int). Le jeu d'instructions sait manipuler de la même manière
des quantités sur 16 ou 32 bits (sauf peut-être les instructions les plus
alambiquées genre CAS2). Mais ce n'était pas vrai pour les modes d'adressage
(indexation etc.): dans les versions initiales (<68020), il n'étaient pas
tous les disponible en version 32 bits, donc il était intéressant d'avoir
des int sur 16 bits pour par exemple indexer les tableaux. De plus, bien
sûr, cela économisait de la place en mémoire centrale, important en 1980.

Au niveau des pointeurs, le plus souvent ils étaient sur 32 bits, mais je
crois bien qu'il y eut des compilos pour 680x0 avec des pointeurs sur 16
bits, dans un espace mémoire limité à 64 K (et les parties hautes de A0-A7
étaient forcées à 0).

Évidement, tout ceci est historique: aujourd'hui tous les compilos pour 68k
sont des compilos 32 bits.


Antoine



Avatar
Antoine Leca
En 40f5666e$0$62356$, DomiPi va escriure:
char i;
for(i=0;i<100;i++) {
etc...
}

Qu'en est il de l'optimisation sur les PC 32 bits actuels?


Quelle optimisation ? il n'y a aucun code ici... Il faudrait regarder ce
qu'il y a dans "etc..."

Est ce que i n'occupe réellement que un octet ?


Pas forcément. Normalement, les variables sont alignés en mémoire (en
l'occurence, probablement sur une frontière de 32 bits, ou 128). Cette
nécessité d'alignement fait qu'une simple variable i va "utiliser" tout
l'espace entre deux frontières, donc 32 ou 128 bits.
D'un autre côté, si tu as une autre variable j, celle-ci va venir dans le
trou, et en fait elle n'occupera aucun espace.

Et si oui est ce que la vitesse d'exécution n'est pas pénalisée ?


Elle peut.

En l'occurence, il n'y a pas de souci, car l'architecture Intel te donne
toutes les possibilités (comparaison avec constante, incrémentation) en
version 8 ou 32 bits, pour le même coût.

Mais si dans «etc...» tu fais la moindre opération, les choses peuvent
changer. Par exemple, si tu as le code

a = a + i;

En version int, tu aurais

MOV EXX, i
ADD a, EXX

Et en version char, tu vas avoir

MOVsX EXX, i
ADD a, EXX

MOVSX/MOVZX est plus cher qu'un simple MOV (dépend processeur), et coûte 1
ou 2 octets de code en plus (qui à leur tour "coûte" du cache, empêchent
certains Jcc de tenir sur 2 octets, ... Les analyses de AMD montrent que cet
effet est sensible en temps d'exécution.)


Antoine

Avatar
cedric
Antoine Leca wrote:
Et en version char, tu vas avoir

MOVsX EXX, i
ADD a, EXX

MOVSX/MOVZX est plus cher qu'un simple MOV (dépend processeur), et coûte 1
ou 2 octets de code en plus


Comment ? Pas un seul compilo encore capable d'utiliser les registres 8
bits de l'intel ?

La misère de voir 32 beaux bits gachés alors qu'avec un code plus
compact, on aurait pu utiliser AL *et* AH, BL *et* BH, etc...

1 2 3