86Fermer88
GodzilLe 06/05/2008 à 21:43
Thibaut (./67) :
Godzil : C'est le code de ton émulateur ?

if (config->memory_stack_read != NULL) 
      cpu->memory_stack_read = config->memory_stack_read; 
else 
      cpu->memory_stack_read = config->memory_read; 
Selon la valeur de config->memory_stack_read, le processeur effectue :
• NULL : un test, puis un saut, puis une affectation
•!NULL : un test, puis une affectation, puis un saut
Les deux cas ont un temps de traitement visiblement identique.

Si on écrit ça :
cpu->memory_stack_read = config->memory_stack_read;
if (cpu->memory_stack_read == NULL)
      cpu->memory_stack_read = config->memory_read;
Selon la valeur de config->memory_stack_read, le processeur effectue :
•!NULL : une affectation, puis un test, puis un saut
• NULL : une affectation, puis un test, puis une affectation
Le premier cas est visiblement aussi rapide à traiter que dans l'écriture de départ.
Le second cas est peut-être plus rapide que le premier sur un 68000 ? (affectation plus rapide qu'un saut)

Sur d'autres processeurs, qui disposent d'un op-code pour réaliser l'inversion logique (c'est à dire qui effectuent !variable en 1 cycle machine), peut-être que cette solution serait encore plus rapide :
cpu->memory_stack_read= (config->memory_read & (!config->memory_stack_read)) | config->memory_stack_read;?

Sachant que le code en question est appelé généralement qu'une seule fois par exécution et que la lisibilité du code est le plus important, a vrai dire j'en ai raf c'est truc du genre ce que tu propose j'en ai ailleurs, la ou c'est vraiment utile


./63: tu sais, il y a des choses que le magic pattern ne peuvent pas faire, et être sur qu'une structure est remplie correctement, il ne le font pas, et faire plusieurs if pour remplir chacun des élément de la structure, est indispensable. Même si actuellement je suis le seul a utiliser le code, je préfère perdre 100.000 cycles au moment de l'initialisation pour être sur que quoi qu'il se passe, il n'y auras pas de problèmes.