Perché hai chiamato la procedura 'fillArray', ho presupposto che ti piacesse riempire un intero blocco di memoria con un valore di byte. Quindi ho fatto un confronto su approcci diversi. È un codice masm a 32 bit, ma i risultati dovrebbero essere simili nella modalità 64 bit. Ogni approccio è testato con entrambi i buffer allineati e non allineati. Ecco i risultati:
Simple REP STOSB - aligned....: 192
Simple REP STOSB - not aligned: 192
Simple REP STOSD - aligned....: 191
Simple REP STOSD - not aligned: 222
Simple while loop - aligned....: 267
Simple while loop - not aligned: 261
Simple while loop with different addressing - aligned....: 271
Simple while loop with different addressing - not aligned: 262
Loop with 16-byte SSE write - aligned....: 192
Loop with 16-byte SSE write - not aligned: 205
Loop with 16-byte SSE write non-temporal hint - aligned....: 126 (EDIT)
La variante più ingenuo utilizzando il seguente codice sembra per eseguire meglio in entrambi gli scenari e ha la dimensione del codice più piccolo così:
cld
mov al, 44h ; byte value
mov edi, lpDst
mov ecx, 256000*4 ; buf size
rep stosb
EDIT: Non è il più veloce per dati allineati. Aggiunta la versione MOVNTDQ che offre le prestazioni migliori, vedi sotto.
Per ragioni di completezza, qui ci sono estratti dalle altre routine - il valore si presume essere ampliato in EAX prima:
Rep Stosd:
mov edi, lpDst
mov ecx, 256000
rep stosd
semplice, mentre:
mov edi, lpDst
mov ecx, 256000
.while ecx>0
mov [edi],eax
add edi,4
dec ecx
.endw
Diversi semplici mentre:
mov edi, lpDst
xor ecx, ecx
.while ecx<256000
mov [edi+ecx*4],eax
inc ecx
.endw
SSE (entrambi):
movd xmm0,eax
punpckldq xmm0,xmm0 ; xxxxxxxxGGGGHHHH -> xxxxxxxxHHHHHHHH
punpcklqdq xmm0,xmm0 ; xxxxxxxxHHHHHHHH -> HHHHHHHHHHHHHHHH
mov ecx, 256000/4 ; 16 byte
mov edi, lpDst
.while ecx>0
movdqa xmmword ptr [edi],xmm0 ; movdqu for unaligned
add edi,16
dec ecx
.endw
SSE (NT, allineato, EDIT):
movd xmm0,eax
punpckldq xmm0,xmm0 ; xxxxxxxxGGGGHHHH -> xxxxxxxxHHHHHHHH
punpcklqdq xmm0,xmm0 ; xxxxxxxxHHHHHHHH -> HHHHHHHHHHHHHHHH
mov ecx, 256000/4 ; 16 byte
mov edi, lpDst
.while ecx>0
movntdq xmmword ptr [edi],xmm0
add edi,16
dec ecx
.endw
ho caricato l'intero codice qui http://pastie.org/9831404 --- pacchetto MASM dalla gabbia è necessaria per l'assemblaggio .
Se si desidera imparare un po 'di MMX/SSE ci sono tali istruzioni. Ma in questo caso sarà probabilmente più lento perché è solo per un valore. SSE funziona molto meglio se si eseguono calcoli su più valori contemporaneamente. –