Bonjour sambia39,
J'ai écrit des bêtises : Je n'ai vraiment rien à reprocher à Linux. C'est l'incompréhension totale de ce qui se passait qui m'a fait écrire cela. C'était un pointeur su fonction qui "marche" une fois, puis provoque une erreur de segmentation ou la rencontre d'un opcode illégal la fois suivante (je n'avais jamais vu cette dernière erreur au par avant).
Bon ou pas, l'objectif initial était des fonctions imbriquées pour avoir une variable registre pointant la structure essentielle et nécessaire à toutes ces fonctions. Une fois le logiciel fonctionnel, il m'a été facile et rapide de remplacer partout les accès à cette locale par des accès à la globale. Et la la différence des temps d'exécution étaient dérisoire.
La boucle de mesure :
Comme on peut le deviner, 10k "pas" sont effectué en continu, avant que la main soit passée à l'ordonnanceur. L'affichage d'un '.' tous les méga "pas" pour dire que ça vit, l'affichage des temps au bout de 100M "pas". 15 affichages (~ 1/2 minute) -> placement des résultat dans un feuille de calcul.Code:
1
2
3
4
5
6
7
8
9
10
11
12 while (++uC_counter%10000) Emu_Step(); if (!(uC_counter%10000000L)) Bug_PrintfSdTo(STDOUT_FILENO, "."); if (!(uC_counter%100000000L)) { tEnd = GetTimeStamp(); Bug_PrintfSdTo(STDOUT_FILENO, "Delta T: %ld(µS) -> 1µC: %fµS\r\n" ,tEnd-gT0, ((float)(tEnd - gT0) / 100000000L)); gT0 = GetTimeStamp(); } usleep(0); ...
Trois tests : avec -O0, -O et -O2, pour un code "full switches" et un code "jump table". Ce test ne vaut pas tant que ça puisqu'un seul type d'instruction est exécuté, mais on ne test pas l'émulateur lui-même.
Code:
1
2
3
4
5 Full Switch / Jump table vitesse Taille du code -O0 : 1,0150 1 (ref) 111640 / 109152 -O 0,965 0,613 96768 / 96432 -O2 0,998 0,560 96728 / 96400 cd ~/_4/1_emu_6309/ ; gcc $C8_TST -Werror -o ./b.out src/emu_9_v_OK_switches.c ; gcc $C8_TST -Werror -o ./a.out src/emu_9_v_OK_jumps.c
En conclusion, les chefs étoilés ont raison.
- écrire une seule fonction avec une variable registre locale pointant une variable structure globale ne vaut pas beaucoup plus que des accès directement à la globale,
- mieux vaut utiliser les switches plutôt que les tables de sauts. Plus portable, un peu plus lisible (tout de même). Et même si les différences sont faibles du point des vitesses et des tailles de code (sources et générés).
Merci à vous.