比CopyMemory还要快的函数SuperCopyMemory



'VB内嵌ASM加快内存数据复制
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes As Long)
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function QueryPerformanceCounter Lib "kernel32" (X As Currency) As Boolean
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (X As Currency) As Boolean
Private OpCode(200) As Byte, CodeStar As Long, opIndex As Long
Private sArr(5000000) As Byte, dArr(5000000) As Byte

'*************************************************************************
'**模 块 名:SuperCopyMemory VB范例
'**说       明:丹心软件在线设计 版权所有2007 - 2008(C)
'**创 建 人:丹心
'**日       期:2007-09-03 22:13:43
'**修 改 人:
'**日       期:
'**描       述:比CopyMemory还要快的函数SuperCopyMemory(),应用在高速内存复制需求上
'**版       本:V1.0.0
'**博客地址:
http://hi.baidu.com/starwork/
'**QQ     号码:121877114
'**E - mail:cnstarwork@126.com
'*************************************************************************

Public Sub SuperCopyMemory(ByVal lpDest As Long, ByVal lpSource As Long, ByVal cBytes As Long)
       CallWindowProc CodeStar, 0, lpDest, lpSource, cBytes
End Sub

Public Sub AsmIni()
       Dim i As Long
       CodeStar = (VarPtr(OpCode(0)) Or &HF) + 1
       opIndex = CodeStar - VarPtr(OpCode(0))
       For i = 0 To opIndex - 1
           OpCode(i) = &HCC
       Next
       AddByteToCode &H50: AddByteToCode &H53: AddByteToCode &H51: AddByteToCode &H56: AddByteToCode &H57: AddByteToCode &H8B
       AddByteToCode &H7C: AddByteToCode &H24: AddByteToCode 28: AddByteToCode &H8B: AddByteToCode &H74: AddByteToCode &H24
       AddByteToCode 32: AddByteToCode &H8B: AddByteToCode &H4C: AddByteToCode &H24: AddByteToCode 36: AddByteToCode &HB8
       i = 64
       AddLongToCode i: AddByteToCode &H8B: AddByteToCode &HD9: AddByteToCode &HFC: AddByteToCode &H3B: AddByteToCode &HC8
       AddByteToCode &H7C: AddByteToCode &H52: AddByteToCode &HC1: AddByteToCode &HE9: AddByteToCode &H6: AddByteToCode &HF
       AddByteToCode &H18: AddByteToCode &H46: AddByteToCode &H40: AddByteToCode &HF: AddByteToCode &H18: AddByteToCode &H47
       AddByteToCode &H40: AddByteToCode &HF: AddByteToCode &H6F: AddByteToCode &H6: AddByteToCode &HF: AddByteToCode &HE7: AddByteToCode &H7
       AddByteToCode &HF: AddByteToCode &H6F: AddByteToCode &H4E: AddByteToCode &H8: AddByteToCode &HF: AddByteToCode &HE7
       AddByteToCode &H4F: AddByteToCode &H8: AddByteToCode &HF: AddByteToCode &H6F: AddByteToCode &H56: AddByteToCode &H10
       AddByteToCode &HF: AddByteToCode &HE7: AddByteToCode &H57: AddByteToCode &H10: AddByteToCode &HF
       AddByteToCode &H6F: AddByteToCode &H5E: AddByteToCode &H18: AddByteToCode &HF: AddByteToCode &HE7: AddByteToCode &H5F
       AddByteToCode &H18: AddByteToCode &HF: AddByteToCode &H6F: AddByteToCode &H66: AddByteToCode &H20: AddByteToCode &HF
       AddByteToCode &HE7: AddByteToCode &H67: AddByteToCode &H20: AddByteToCode &HF: AddByteToCode &H6F
       AddByteToCode &H6E: AddByteToCode &H28: AddByteToCode &HF: AddByteToCode &HE7: AddByteToCode &H6F: AddByteToCode &H28
       AddByteToCode &HF: AddByteToCode &H6F: AddByteToCode &H76: AddByteToCode &H30: AddByteToCode &HF: AddByteToCode &HE7
       AddByteToCode &H77: AddByteToCode &H30: AddByteToCode &HF: AddByteToCode &H6F: AddByteToCode &H7E
       AddByteToCode &H38: AddByteToCode &HF: AddByteToCode &HE7: AddByteToCode &H7F: AddByteToCode &H38
       AddByteToCode &H3: AddByteToCode &HF0: AddByteToCode &H3: AddByteToCode &HF8: AddByteToCode &H49
       AddByteToCode &H75: AddByteToCode &HB3: AddByteToCode &HF
       AddByteToCode &H77: AddByteToCode &H8B: AddByteToCode &HCB: AddByteToCode &H48: AddByteToCode &H23
       AddByteToCode &HC8: AddByteToCode &H74: AddByteToCode &H2: AddByteToCode &HF3: AddByteToCode &HA4: AddByteToCode &H5F
       AddByteToCode &H5E: AddByteToCode &H59: AddByteToCode &H5B: AddByteToCode &H58: AddByteToCode &HC2
       AddByteToCode &H10: AddByteToCode &H0: AddByteToCode &HCC
End Sub
Public Sub AddByteToCode(bData As Byte)
       OpCode(opIndex) = bData
       opIndex = opIndex + 1
End Sub
Public Sub AddLongToCode(lData As Long)
       CopyMemory OpCode(opIndex), lData, 4
       opIndex = opIndex + 4
End Sub

'SuperCopyMemory() Function

Private Sub Command1_Click()
       Dim S1 As Currency, S2 As Currency
       Dim f As Currency, t1 As Currency
       Call QueryPerformanceFrequency(f)       '计时
       Call QueryPerformanceCounter(S1)
       SuperCopyMemory VarPtr(dArr(0)), VarPtr(sArr(0)), 5000000
       Call QueryPerformanceCounter(S2)
       t1 = (S2 - S1) / f
       Command1.Caption = "时间=" & t1
End Sub

'----- CopyMemory
Private Sub Command2_Click()
       Dim S1 As Currency, S2 As Currency
       Dim f As Currency, t1 As Currency
       Call QueryPerformanceFrequency(f)       '计时
       Call QueryPerformanceCounter(S1)
       CopyMemory dArr(0), sArr(0), 5000000
       Call QueryPerformanceCounter(S2)
       t1 = (S2 - S1) / f
       Command2.Caption = "时间=" & t1
End Sub

'----- 传统VB方式
Private Sub Command3_Click()
       Dim S1 As Currency, S2 As Currency
       Dim f As Currency, t1 As Currency
       Dim i As Long
       Call QueryPerformanceFrequency(f)       '计时
       Call QueryPerformanceCounter(S1)
       For i = 0 To 4999999
           dArr(i) = sArr(i)
       Next
       Call QueryPerformanceCounter(S2)
       t1 = (S2 - S1) / f
       Command3.Caption = "时间=" & t1
End Sub

Private Sub Form_Load()

       Me.Caption = "SuperCopyMemory VB范例"
       Dim i As Long, j As Integer
       For i = 0 To UBound(sArr)
           sArr(i) = j
           j = j + 1
           If j > 255 Then j = 0
       Next
       AsmIni
End Sub


丹心版权所有.转载发表请注明出处,并通知本人

转载于:https://www.cnblogs.com/starwork/archive/2007/09/03/880825.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值