(tu ne crois pas que tu pousses un peu le bouchon, sérieusement ?

;========================================================
;
; GetArchiveHandle
;
; Return the handle of the archive to process
;
; input a0 Archive name (C-string)
; ouput d0.w Handle of the archive if ERROR_CODE(a6) == AR_NO_ERROR. ERROR_CODE(a6) is set at the right value
; destroy std
;========================================================
GetArchiveHandle:
pea (a0)
moveq.l #$FFFFFFF8,d0 ; OTH_TAG
lea ArchiveSignature(pc),a1
jsr CHECK_FILE_TYPE(a6)
movea.l (sp)+,a0
moveq.l #AR_NOT_AN_ARCHIVE,d1
tst.w d0
beq.s \ArchiveFound
bpl.s \Quit
moveq.l #AR_ARCHIVE_NOT_FOUND,d1
bra.s \Quit
\ArchiveFound:
jsr GET_FILE_HANDLE(a6)
moveq.l #AR_NO_ERROR,d1
\Quit: move.w d1,ERROR_CODE(a6)
rts
Folco (./31) :
C'est votre technique exposée plus haut que j'ai pas bien comprise, j'ai du mal à voir la correspondance du if/else en C.
Je voulais juste savoir comment appliquer votre optimisation à mon code, sur le plan théorique, pas pour optimiser 2 cycles ^^
./3>
Au final ce qui va compter c'est la prédictibilité de c pour le CPU. Et encore, si ce n'est pas exécuté dans une boucle critique, ce n'est sans doute pas important de s'attarder dessus.
À priori, GCC te permet d'aider le CPU avec __builtin_expect(,) mais ça n'a pas l'air possible avec Visual C++ par exemple (vu que ta question mentionne GC,C je suppose que ça ira )
D'autres t'en diront sans doute plus (PpHd, bearbecue ?)
./8>
Tiens, intéressant, merci. Il y a un équivalent pour VC++ ?
jge+ _Label # dit au CPU de supposer que le jump sera execute jge- _Label # dit au CPU de supposer que le jump ne sera pas execute
if (unlikely(condition)) B(); else A();
if (!condition) A(); else B();
./10>
Aucune idée de la confiance qu'on peut avoir en ce document, mais il dit (page 57) que GCC place B en premier et repousse A plus loin, potentiellement très loin, genre après tout le reste des instructions de la fonction (le schéma en bas de page sera plus clair que moi). De cette manière, on a une exécution parfaitement linéaire le plus souvent. C'est encore mieux que l'astuce décrite dans le post ./1
./39>Folco : Pour compléter la réponse de Brunni avec mon peu de connaissances, le pipeline c'est le système qui consiste, sur les processeurs modernes, à paralléliser les 4 étapes successives qui sont nécessaires pour exécuter une instruction (de mémoire : lecture, décodage, exécution, écriture). Chaque instruction passe successivement dans ces 4 modules, donc nécessite au moins 4 cycles pour s'exécuter comme sur 68k, mais, pendant qu'une instruction est traitée par un module, le module précédent traite l'instruction suivante. Il y a donc une instruction qui rentre dans le pipeline et une instruction qui se termine à chaque cycle, ainsi le temps d'exécution moyenné d'une instruction n'est plus que de 1 cycle
bearbecue (./47) :De toute façon, même avec des vieux processeurs il fallait déjà se méfier de tout ces mangeurs de cycles
c'est pour ca que ca sert souvent a grand chose de compter les cycles sur les CPUs modernes (ie: c'est pas toujours faisable), et qu'il vaut mieux profiler le code dans son cas reel d'utilisation
bearbecue (./47) :
Et sur les CPUs hyper-threades (genre les core-i7, ou des core2-quad HT, qui n'ont que 2 vrais cores), il y a encore des trucs en plus, les unites d'execution sont partagees dans les deux threads hardware, mais chaque hyper-thread a son propre bout de silicium pour fetch et decoder les instructions, donc les interactions peuvent devenir extremement complexes, voire pas calculables du tout, vu que la performance de ton bout d'asm micro-optimise aux petits oignons va dependre de quel autre process est schedule sur l'autre hyper-thread de ton core.
bref... ^^
c'est pour ca que ca sert souvent a grand chose de compter les cycles sur les CPUs modernes (ie: c'est pas toujours faisable), et qu'il vaut mieux profiler le code dans son cas reel d'utilisation
bearbecue (./50) :
plutot vive -O3/o/
Perso j'optimise certaines parties en vitesse ou en taille effectivement, en fonction de la fréquence d'accès et la taille (estimée) de la boucle. Mais c'est toujours assez délicat ce genre de choses, ça change avec le temps (proço, compilo ou code mis à jour).