程序的功能是读取硬盘上的3个文件,在申请的内存中让这3个文件异或,最后把目标文件写入磁盘。文件基本都是上百G的所以循环执行上面的操作。现在的问题是速度太慢,请帮忙看看怎么提高速度。部分源代码如下:
先申请内存
;**********************************************************************
;读指定文件到申请的虚拟内存
;**********************************************************************
push ecx ;压入的是要循环的次数,每次循环执行8M(1024*1024*8这个值是可以变化的)的异或操作,
invoke ReadFile,@hHD1,Buffer_Point1,BUFFER_SIZE,addr dwCount,NULL
.if eax == 0
invoke MessageBox,0,$CTA0("读1.img文件错误"),NULL,MB_ICONEXCLAMATION
.endif
invoke ReadFile,@hHD2,Buffer_Point2,BUFFER_SIZE,addr dwCount,NULL
.if eax == 0
invoke MessageBox,0,$CTA0("读4.img文件错误"),NULL,MB_ICONEXCLAMATION
.endif
invoke ReadFile,@hHD3,Buffer_Point3,BUFFER_SIZE,addr dwCount,NULL
.if eax == 0
invoke MessageBox,0,$CTA0("读5.img文件错误"),NULL,MB_ICONEXCLAMATION
jmp _exit
.endif
jmp _PerXor
@@:
push ecx
invoke ReadFile,@hHD1,Buffer_Point1,BUFFER_SIZE,addr dwCount,NULL
invoke ReadFile,@hHD2,Buffer_Point2,BUFFER_SIZE,addr dwCount,NULL
invoke ReadFile,@hHD3,Buffer_Point3,BUFFER_SIZE,addr dwCount,NULL
;***************************************************************************
;执行异或操作
;***************************************************************************
_PerXor:
mov ecx,1024*1024*8/4 ;对应下面的loop指令中的ecx
mov edi,Buffer_Point1 ;Buffer_Point1为指针变量,值为申请内存的地址,其他类似
mov esi,Buffer_Point2
mov ebx,Buffer_Point3
@:
mov eax,[edi]
xor eax,[esi]
xor eax,[ebx]
mov [edi],eax
add edi,4
add esi,4
add ebx,4
loop @
;写入目标文件
invoke WriteFile,@hHD4,Buffer_Point1,BUFFER_SIZE,addr dwCount,NULL
.if eax == 0
invoke MessageBox,0,$CTA0("写失败"),NULL,MB_OK
jmp _exit
.endif
pop ecx
dec ecx
cmp ecx,0
jg @B
以下是我改写成读异步的源代码,在XP上执行正确但速度没什么提高,在windows2003的操作系统上面总是写失败,不知道什么原因。读异步一直没成功。请高手指教!invoke ReadFile,@hHD1,Buffer_Point1,BUFFER_SIZE,addr dwCount,NULL
.if eax == 0
invoke MessageBox,0,$CTA0("读1.img文件错误"),NULL,MB_ICONEXCLAMATION
.endif
invoke ReadFile,@hHD2,Buffer_Point2,BUFFER_SIZE,addr dwCount,NULL
.if eax == 0
invoke MessageBox,0,$CTA0("读4.img文件错误"),NULL,MB_ICONEXCLAMATION
.endif
invoke ReadFile,@hHD3,Buffer_Point3,BUFFER_SIZE,addr dwCount,NULL
.if eax == 0
invoke MessageBox,0,$CTA0("读5.img文件错误"),NULL,MB_ICONEXCLAMATION
jmp _exit
.endif
mov @overlapped.loffset,0
mov @overlapped.OffsetHigh,0
cld
jmp _PerXor
@@:
push ecx
add @overlapped.loffset,BUFFER_SIZE
mov @overlapped.OffsetHigh,0
invoke ReadFile,@hHD1,Buffer_Point1,BUFFER_SIZE,addr dwCount,NULL
invoke ReadFile,@hHD2,Buffer_Point2,BUFFER_SIZE,addr dwCount,NULL
invoke ReadFile,@hHD3,Buffer_Point3,BUFFER_SIZE,addr dwCount,NULL
;***************************************************************************
;执行异或操作
;***************************************************************************
_PerXor:
mov ecx,1024*1024*64/4 ;对应下面的loop指令中的ecx
mov edi,Buffer_Point1
mov esi,Buffer_Point2
mov ebx,Buffer_Point3
@:
mov eax,[edi]
xor eax,[esi]
xor eax,[ebx]
mov [edi],eax
add edi,4
add esi,4
add ebx,4
loop @
;写入目标文件
invoke WriteFile,@hHD4,Buffer_Point1,BUFFER_SIZE,addr dwCount,addr @overlapped
.if eax == 0
invoke MessageBox,0,$CTA0("写失败"),NULL,MB_OK
jmp _exit
.endif
pop ecx
dec ecx
cmp ecx,0
jg @B
------解决方案--------------------------------------------------------