Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pourquoi éviter une puissance de 2 du dim tableau pour optimisation

12 réponses
Avatar
poulacou
Sur quelques documents qui relatent les bons usages du codage par
soucis d'optimisation d'execution,
il est mentionn=E9 :
- d'=E9viter d'avoir une dimension de tableau =E9gal =E0 une puissance de 2

Je comprend pas trop cette recommandation ... m=EAme au contraire, dans
mon esprit je l'aurai encourag=E9 ! essayer au maximum des tailles de
tableau multiple du cache de donn=E9es L1 et L2

En esperant que vous ayez compris mon int=E9rrogation,
Merci pour vos eclaircissements

Bien amicalement

2 réponses

1 2
Avatar
Antoine Leca
En news:fhm765$tdk$, Patrick 'Zener' Brunet va
escriure:
...alors allouer 4 octets de moins qu'un multiple
de cette puissance est une optimisation,


... qui ne marche QUE si l'implémentation de malloc() réserve 4 octets ou
moins pour sa gestion interne.

Si par contre cette dite implémentation utilise une taille sur 6 ou 8 octets
pour la taille, ou si elle stocke en plus un détrompeur (cookie) pour
repérer les allocations-désallocations mal faites, ou deux pointeurs 32 bits
sur les blocs suivant et précédent, l'optimisation est prise gravement en
défaut.

Par ailleurs, si la taille du bloc alloué est stockée en dehors du bloc (par
exemple, dans le malloc() rapide, où les blocs ont toujours des tailles
multiples de 2, et où l'adresse du bloc indique de quel tas il provient donc
de quel taille il s'agit; ou si on utilise une mémoire segmentée, et où
chaque bloc est un segment à lui tout seul), tu punis inutilement le
programme.


Antoine

Avatar
Patrick 'Zener' Brunet
Bonsoir.

"Antoine Leca" a écrit dans le message de news:
fhs426$nvl$
En news:fhm765$tdk$, Patrick 'Zener' Brunet va
escriure:
...alors allouer 4 octets de moins qu'un multiple
de cette puissance est une optimisation,


... qui ne marche QUE si l'implémentation de malloc() réserve 4 octets ou
moins pour sa gestion interne.

Si par contre cette dite implémentation utilise une taille sur 6 ou 8
octets

pour la taille, ou si elle stocke en plus un détrompeur (cookie) pour
repérer les allocations-désallocations mal faites, ou deux pointeurs 32
bits

sur les blocs suivant et précédent, l'optimisation est prise gravement en
défaut.

Par ailleurs, si la taille du bloc alloué est stockée en dehors du bloc
(par

exemple, dans le malloc() rapide, où les blocs ont toujours des tailles
multiples de 2, et où l'adresse du bloc indique de quel tas il provient
donc

de quel taille il s'agit; ou si on utilise une mémoire segmentée, et où
chaque bloc est un segment à lui tout seul), tu punis inutilement le
programme.



Je suis innocent Antoine :-)

J'ai bien écrit:
"Evidemment tout dépend de l'algorithme et de ses réglages".

En effet, en plus du header caché (de taille variable c'est vrai, mais
formellement il contient l'information de taille et un bit indiquant l'état
libre/alloué, sauf bien sûr en mode debug ou ça peut être plus bavard)
indispensable pour les algorithmes à tailles libres, on prévoit souvent une
sentinelle en fin de bloc... Il y en a même qui y conservent les pointeurs
de chaînage pour les bocs alloués...
J'avais voulu faire simple dans ma démo.

Concernant les algorithmes à ségrégation, en effet on n'a pas forcément
besoin de header, par contre la taille de bloc n'est pas forcément binaire:
il y a des algos en 1/4 + 3/4 et j'en ai écrit un qui utilise 4 classes par
niveau d'échelle.

Bref ce que je voulais dire c'est qu'il n'y a pas de recette magique, la
recommandation sur laquelle s'interrogeait "poucalou" *peut être justifiée*
dans un contexte particulier, je donnais donc *un exemple* concret, mais il
n'est pas correct d'en faire une règle générale.

Bref si on veut optimiser, il faut en savoir plus sur les outils
sous-jacents.

--
Cordialement.
--
/**************************************************
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
**************************************************/


1 2