Problème de macro [C] - Programmation
Marsh Posté le 05-07-2002 à 15:33:24
Bon j'ai trouvé, c'était 1 manque de () autour du x et du y (pb classque avec les macros)
tomiotomio a écrit a écrit : par ailleurs, je vois pas bien l interet d en faire une maccro |
Ben pour éviter un appel de f°
Marsh Posté le 05-07-2002 à 15:42:55
bobdupont a écrit a écrit : Bon j'ai trouvé, c'était 1 manque de () autour du x et du y (pb classque avec les macros) Ben pour éviter un appel de f° |
??? Mouais
Marsh Posté le 05-07-2002 à 15:43:57
Rajoute un groupe de parenthés autour, marchera peut être mieu
Marsh Posté le 05-07-2002 à 16:10:09
bobdupont a écrit a écrit : Ben pour éviter un appel de f° |
Ce genre d'optimisation était valable à l'époque des 8086... mais de nos jours ??
De plus, si vraiment tu tiens à ne pas faire d'appel de fonction, tu peux toujours déclarer cette fonction inline...
Marsh Posté le 05-07-2002 à 16:13:15
Harkonnen a écrit a écrit : Ce genre d'optimisation était valable à l'époque des 8086... mais de nos jours ?? |
C'est une fonction pour lire 1 pixel dans la mémoire video
+ c'est rapide mieux c'est
Harkonnen a écrit a écrit : De plus, si vraiment tu tiens à ne pas faire d'appel de fonction, tu peux toujours déclarer cette fonction inline... |
Il s'agit d'un source C
Marsh Posté le 05-07-2002 à 17:36:26
bobdupont a écrit a écrit : Il s'agit d'un source C |
inline existe en C99.
Marsh Posté le 05-07-2002 à 18:03:14
effectivement, il faut probablement rajouter une parenthèse.
pour la vitesse oui un "call" (appel de sous-fonction) par pixel dans une routine travaillant au niveau pixel réduirait dramatiquement les performances, même sur un cpu actuel (ni les CPU ni les optimisations de carte 3D ne compensent des erreurs de programmation)
ensuite la pluspart des compilateurs C ou C++ font de l'expansion en ligne automatique, donc si tu mets toutes les options d'optimisations et ça devrait aller (au pire tu contrôles le code généré en assembleur). Même pas forcément besoin d'un inline.
ensuite si tu veux booster y'a une méthode plus simple pour gagner du temps:
unsigned char *Buffer=surface->pixels;
et tu te balades avec un Buffer[....]
ensuite vu que tu risques de faire des for, je te conseilles une approche type:
Code :
|
1) effectivement éviter les "call", si le compilo fait de l'expension en ligne, pas de problème....
2) remonter tout ce qui est constant dans la boucle la plus imbriqué pour refaire monter le calcul des constantes dans les boucles supérieures... (par exemple remonter des calculs de constante propres à chaque ligne dans le while() des lignes)
3) éviter les calcul d'adresse par des multiplications genre [y*largeur+x], favoriser des incrémentations/addition de pointeurs....
4) tables de précalcul...
pour gagner du temps il ne faut pas chercher à avoir un foncion putpixel/getpixel rapide, mais à avoir la routine qui traite un bloc de pixel relativement bien optimisée)
Pour booster, il faut pas penser un routine qui traite un élément, mais une routine qui traite un "tableau" d'éléments....
Marsh Posté le 05-07-2002 à 18:05:24
bjone a écrit a écrit : ensuite la pluspart des compilateurs C ou C++ font de l'expansion en ligne automatique, donc si tu mets toutes les options d'optimisations et ça devrait aller (au pire tu contrôles le code généré en assembleur). Même pas forcément besoin d'un inline. |
De toute façon, inline, c'est comme register : la norme précise bien que ce n'est qu'une indication d'optimisation qui n'a rien d'impératif.
Marsh Posté le 05-07-2002 à 18:10:43
l'inline est pas génant.
le "register" peut être une contre-optimisation.
un bon compilo avec toutes les options d'optimisations saura relativement très bien allouer les registres aux varibles, et le fait de forcer une variable dans un registre pourrait s'avérer être une contre-optimisation, par exemple:
ça comme ça, c'est pas forcément mauvais:
Code :
|
et ça c'est plustôt pas bon si la boucle pixel par pixel n'a plus de registre:
Code :
|
la règle d'or c'est de toujours favoriser la boucle la plus imbriqué pour gagner du temps, il faut favoriser le code qui a la plus haute fréquence d'éxécution...
Marsh Posté le 05-07-2002 à 13:46:45
Salut,
J'ai 1 fonction qui marche très bien et j'ai voulu en faire une macro. Mais sous forme de macro, ça ne marche plus. Je voia aucune différence entre les 2 :