• 比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


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

  • 相关阅读:
    解决Oracle XE报错ORA-12516(oracle回话数超出限制)
    端口被占用如何处理
    ORACLE initialization or shutdown in progress 错误解决办法
    oracle的闪回功能
    Linux入门
    oracle字段like多个条件
    navicat常用快捷键与SQL基本使用
    Oracle四舍五入,向上取整,向下取整
    无限循环小数化分数
    筛选素数
  • 原文地址:https://www.cnblogs.com/starwork/p/880825.html
Copyright © 2020-2023  润新知