क्योंकि आपने अपनी प्रक्रिया 'fillArray' कहा है, मुझे लगता है कि आप एक बाइट वैल्यू के साथ एक संपूर्ण मेमोरी ब्लॉक भरना चाहते हैं। तो मैंने विभिन्न दृष्टिकोणों पर तुलना की। यह 32 बिट मैस्म कोड है, लेकिन परिणाम 64 बिट मोड में समान होना चाहिए। प्रत्येक दृष्टिकोण दोनों गठबंधन और unaligned बफर के साथ परीक्षण किया जाता है। यहाँ परिणाम हैं:
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)
सबसे अनुभवहीन संस्करण निम्न कोड दोनों स्थितियों में सबसे अच्छा प्रदर्शन करने के लिए लगता है और सबसे छोटा कोड आकार के रूप में अच्छी तरह से है का उपयोग करते हुए:
cld
mov al, 44h ; byte value
mov edi, lpDst
mov ecx, 256000*4 ; buf size
rep stosb
संपादित करें: यह नहीं करने के लिए सबसे तेजी से है गठबंधन डेटा। जोड़ा गया MOVNTDQ संस्करण जो सबसे अच्छा प्रदर्शन करता है, नीचे देखें।
पूर्णता के लिए के लिए, यहाँ अन्य दिनचर्या के अंश हैं - मूल्य से पहले EAX में विस्तार किया जा करने के लिए माना जाता है:
निरसित Stosd:
mov edi, lpDst
mov ecx, 256000
rep stosd
सरल जबकि:
mov edi, lpDst
mov ecx, 256000
.while ecx>0
mov [edi],eax
add edi,4
dec ecx
.endw
विभिन्न सरल करते हुए:
mov edi, lpDst
xor ecx, ecx
.while ecx<256000
mov [edi+ecx*4],eax
inc ecx
.endw
SSE (दोनों):
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, गठबंधन, संपादित करें):
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
मैं पूरी कोड यहाँ http://pastie.org/9831404 अपलोड --- हच से MASM पैकेज कोडांतरण के लिए आवश्यक है ।
यदि आप कुछ एमएमएक्स/एसएसई सीखना चाहते हैं तो ऐसे निर्देश हैं। लेकिन इस मामले में यह शायद धीमा हो जाएगा क्योंकि यह सिर्फ एक मूल्य के लिए है। अगर आप कई मूल्यों पर गणना करते हैं तो एसएसई बहुत बेहतर प्रदर्शन करता है। –