Vì bạn đã gọi thủ tục 'fillArray' của mình, tôi giả sử bạn muốn lấp đầy toàn bộ khối bộ nhớ bằng một giá trị byte. Vì vậy, tôi đã làm một so sánh về phương pháp tiếp cận khác nhau. Đó là mã masm 32 bit, nhưng kết quả sẽ giống nhau ở chế độ 64 bit. Mỗi phương pháp đều được thử nghiệm với cả bộ đệm liên kết và không thẳng hàng. Dưới đây là kết quả:
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)
Các biến thể ngây thơ nhất sử dụng đoạn mã sau dường như để thực hiện tốt nhất trong cả hai kịch bản và có kích thước mã nhỏ nhất cũng như:
cld
mov al, 44h ; byte value
mov edi, lpDst
mov ecx, 256000*4 ; buf size
rep stosb
EDIT: Đây không phải là nhanh nhất cho dữ liệu được căn chỉnh. Đã thêm phiên bản MOVNTDQ hoạt động tốt nhất, xem bên dưới.
Vì lợi ích của sự hoàn chỉnh, đây là một đoạn trích từ các thói quen khác - giá trị được giả định là mở rộng sang EAX trước:
Rep Stosd:
mov edi, lpDst
mov ecx, 256000
rep stosd
Simple Trong khi:
mov edi, lpDst
mov ecx, 256000
.while ecx>0
mov [edi],eax
add edi,4
dec ecx
.endw
Đơn giản khác nhau khi:
mov edi, lpDst
xor ecx, ecx
.while ecx<256000
mov [edi+ecx*4],eax
inc ecx
.endw
SSE (cả hai):
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, thẳng hàng, 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
Tôi đã tải lên toàn bộ mã ở đây http://pastie.org/9831404 --- gói MASM từ hutch là cần thiết cho lắp ráp .
Nếu bạn muốn tìm hiểu một số MMX/SSE, có những hướng dẫn như vậy. Nhưng trong trường hợp này, nó có thể sẽ chậm hơn vì nó chỉ cho một giá trị. SSE hoạt động tốt hơn nhiều nếu bạn thực hiện các phép tính trên nhiều giá trị cùng một lúc. –