zoukankan      html  css  js  c++  java
  • 比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


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

  • 相关阅读:
    网络通信协议八之(传输层)TCP协议详解
    MongoDB数据库连接失败
    Flask web开发之路十四
    Flask web开发之路十三
    Flask web开发之路十二
    Flask web开发之路十一
    Flask web开发之路十
    NEERC 1999 Advertisement /// oj22646
    upper_bound() lower_bound() 用法
    palindrome 回文 /// Manacher算法
  • 原文地址:https://www.cnblogs.com/starwork/p/880825.html
Copyright © 2011-2022 走看看