U
Utente cancellato 277320
Ultima modifica da un moderatore:
Quale e' piu performante ?
Tutto un discorso legato a che compilatore usi (msvc, o gcc, clang, e molti altri etc etc), che opzioni di compilazione usi, e che ottimizzazioni usi.
Con moderni compilatori come gcc e -O3 (se cerchi la performance) il compilatore ottimizza comunque a sua scelta con molte sue decisioni.
Per altro piu codice non vuol dire meno performance. E in un moderno pc "cisc" difficile che guardando il codice assembly tu capisca la piu performante, tutto un discorso complesso di pipelines/cache/predictions etc. Piu chiaro invece su un micro 8bit con singola pipeline come un atmega o pic, dove la tua strlen si tradurrebbe in un codice che viene eseguito cosi come lo vedi.
Dunque, in un moderno pc per la "performace" devi eseguire un loop di milioni di cicli e misurare il tempo.
Tutto un discorso legato a che compilatore usi (msvc, o gcc, clang, e molti altri etc etc), che opzioni di compilazione usi, e che ottimizzazioni usi.
Con moderni compilatori come gcc e -O3 (se cerchi la performance) il compilatore ottimizza comunque a sua scelta con molte sue decisioni.
Codice:
0000000000001130 <astrlen>:
1130: 80 3f 00 cmpb $0x0,(%rdi)
1133: 74 1b je 1150 <astrlen+0x20>
1135: 48 89 f8 mov %rdi,%rax
1138: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
113f: 00
1140: 48 83 c0 01 add $0x1,%rax
1144: 80 38 00 cmpb $0x0,(%rax)
1147: 75 f7 jne 1140 <astrlen+0x10>
1149: 29 f8 sub %edi,%eax
114b: c3 ret
114c: 0f 1f 40 00 nopl 0x0(%rax)
1150: 31 c0 xor %eax,%eax
1152: c3 ret
1153: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)
115a: 00 00 00
115d: 0f 1f 00 nopl (%rax)
Codice:
0000000000001130 <astrlen> (con 2 errori corretti):
1130: 80 3f 00 cmpb $0x0,(%rdi)
1133: 74 23 je 1158 <astrlen+0x28>
1135: 31 c0 xor %eax,%eax
1137: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1)
113e: 00 00
1140: 41 89 c0 mov %eax,%r8d
1143: 48 83 c0 01 add $0x1,%rax
1147: 80 3c 07 00 cmpb $0x0,(%rdi,%rax,1)
114b: 75 f3 jne 1140 <astrlen+0x10>
114d: 44 89 c0 mov %r8d,%eax
1150: c3 ret
1151: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
1158: 41 b8 ff ff ff ff mov $0xffffffff,%r8d
115e: 44 89 c0 mov %r8d,%eax
1161: c3 ret
1162: 66 2e 0f 1f 84 00 00 cs nopw 0x0(%rax,%rax,1)
1169: 00 00 00
116c: 0f 1f 40 00 nopl 0x0(%rax)
Per altro piu codice non vuol dire meno performance. E in un moderno pc "cisc" difficile che guardando il codice assembly tu capisca la piu performante, tutto un discorso complesso di pipelines/cache/predictions etc. Piu chiaro invece su un micro 8bit con singola pipeline come un atmega o pic, dove la tua strlen si tradurrebbe in un codice che viene eseguito cosi come lo vedi.
Dunque, in un moderno pc per la "performace" devi eseguire un loop di milioni di cicli e misurare il tempo.