程序如下:Option Explicit
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
Private Declare Sub RtlMoveMemory Lib "kernel32" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)Private Sub Command1_Click()
Dim AA(10000) As Long
Dim BB(10000) As Long
Dim I As Long
Dim L As Long
Dim T(3) As LongFor I = 0 To 10000&
   AA(I) = I * I + 1
   BB(I) = 0
Next
T(0) = timeGetTime
For L = 0 To 10000
   For I = 0 To 10000
      CopyMemory BB(I), AA(I), 4
   Next
Next
T(0) = timeGetTime - T(0)For I = 0 To 10000&
   AA(I) = I * I + 1
   BB(I) = 0
Next
T(1) = timeGetTime
For L = 0 To 10000
   For I = 0 To 10000
      MoveMemory BB(I), AA(I), 4
   Next
Next
T(1) = timeGetTime - T(1)For I = 0 To 10000&
   AA(I) = I * I + 1
   BB(I) = 0
Next
T(2) = timeGetTime
For L = 0 To 10000
   For I = 0 To 10000
      RtlMoveMemory BB(I), AA(I), 4
   Next
Next
T(2) = timeGetTime - T(2)For I = 0 To 10000&
   AA(I) = I * I + 1
   BB(I) = 0
Next
T(3) = timeGetTime
For L = 0 To 10000
   For I = 0 To 10000
      BB(I) = AA(I)
   Next
Next
T(3) = timeGetTime - T(3)MsgBox "Total Data munber is 100,000,000" & Chr(13) & "CopyMemory:" & T(0) & " ; MoveMemory:" & T(1) & " ; RtlMoveMemory:" & T(2) & " ; =:" & T(2)
End Sub请编译成EXE后运行,并将您的结果附上,最好是有3次以上结果的平均值。
给出结果者均有分!

解决方案 »

  1.   

    我做下来的结果是: Copy最快,Move次之,RtlMove和=一样都是最慢。
      

  2.   

    timeGetTime 变量未定义
    怎么回事?
      

  3.   

    把timeGetTime改成timer
    结论是一样的~
      

  4.   

    恩,我也改用timer了,但都是0
      

  5.   

    我566的机器……当然可以用timer………… T T
      

  6.   

    抱歉漏贴了:Private Declare Function timeGetTime Lib "winmm.dll" () As Long
      

  7.   

    完整程序:
    Option Explicit
    Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
    Private Declare Sub RtlMoveMemory Lib "kernel32" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
    Private Declare Function timeGetTime Lib "winmm.dll" () As Long
    Private Sub Command1_Click()
    Dim AA(10000) As Long
    Dim BB(10000) As Long
    Dim I As Long
    Dim L As Long
    Dim T(3) As LongFor I = 0 To 10000&
       AA(I) = I * I + 1
       BB(I) = 0
    Next
    T(0) = timeGetTime
    For L = 0 To 10000
       For I = 0 To 10000
          CopyMemory BB(I), AA(I), 4
       Next
    Next
    T(0) = timeGetTime - T(0)For I = 0 To 10000&
       AA(I) = I * I + 1
       BB(I) = 0
    Next
    T(1) = timeGetTime
    For L = 0 To 10000
       For I = 0 To 10000
          MoveMemory BB(I), AA(I), 4
       Next
    Next
    T(1) = timeGetTime - T(1)For I = 0 To 10000&
       AA(I) = I * I + 1
       BB(I) = 0
    Next
    T(2) = timeGetTime
    For L = 0 To 10000
       For I = 0 To 10000
          RtlMoveMemory BB(I), AA(I), 4
       Next
    Next
    T(2) = timeGetTime - T(2)For I = 0 To 10000&
       AA(I) = I * I + 1
       BB(I) = 0
    Next
    T(3) = timeGetTime
    For L = 0 To 10000
       For I = 0 To 10000
          BB(I) = AA(I)
       Next
    Next
    T(3) = timeGetTime - T(3)MsgBox "Total Data munber is 100,000,000" & Chr(13) & "CopyMemory:" & T(0) & " ; MoveMemory:" & T(1) & " ; RtlMoveMemory:" & T(2) & " ; =:" & T(2)
    End Sub请编译成EXE后运行,并将您的结果附上,最好是有3次以上结果的平均值。
    给出结果者均有分!
      

  8.   

    硬件环境:512 内存,p4 2.6G
    软件环境:win2k as,vb 6.0 sp61.
    Total Data munber is 100,000,000
    CopyMemory:6149 ; MoveMemory:6242 ; RtlMoveMemory:6157 ; =:61572.Total Data munber is 100,000,000
    CopyMemory:6003 ; MoveMemory:5958 ; RtlMoveMemory:5896 ; =:58963.
    Total Data munber is 100,000,000
    CopyMemory:6003 ; MoveMemory:5994 ; RtlMoveMemory:5961 ; =:5961
      

  9.   

    靠,弄错了最后一个参数,变成RTLMOVEMEMORY和=一样了:
    改正一下:
    Option Explicit
    Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
    Private Declare Sub RtlMoveMemory Lib "kernel32" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
    Private Declare Function timeGetTime Lib "winmm.dll" () As Long
    Private Sub Command1_Click()
    Dim AA(10000) As Long
    Dim BB(10000) As Long
    Dim I As Long
    Dim L As Long
    Dim T(3) As LongFor I = 0 To 10000&
       AA(I) = I * I + 1
       BB(I) = 0
    Next
    T(0) = timeGetTime
    For L = 0 To 10000
       For I = 0 To 10000
          CopyMemory BB(I), AA(I), 4
       Next
    Next
    T(0) = timeGetTime - T(0)For I = 0 To 10000&
       AA(I) = I * I + 1
       BB(I) = 0
    Next
    T(1) = timeGetTime
    For L = 0 To 10000
       For I = 0 To 10000
          MoveMemory BB(I), AA(I), 4
       Next
    Next
    T(1) = timeGetTime - T(1)For I = 0 To 10000&
       AA(I) = I * I + 1
       BB(I) = 0
    Next
    T(2) = timeGetTime
    For L = 0 To 10000
       For I = 0 To 10000
          RtlMoveMemory BB(I), AA(I), 4
       Next
    Next
    T(2) = timeGetTime - T(2)For I = 0 To 10000&
       AA(I) = I * I + 1
       BB(I) = 0
    Next
    T(3) = timeGetTime
    For L = 0 To 10000
       For I = 0 To 10000
          BB(I) = AA(I)
       Next
    Next
    T(3) = timeGetTime - T(3)MsgBox "Total Data munber is 100,000,000" & Chr(13) & "CopyMemory:" & T(0) & " ; MoveMemory:" & T(1) & " ; RtlMoveMemory:" & T(2) & " ; =:" & T(3) '就是这个弄错了,应该是3而不是2
    End Sub
      

  10.   

    第1次:Copy慢,Move快,RtlMove同=,中速;
    第2次:Copy快,Move中速,RtlMove同=,慢;
    第3次:Copy中速,Move快,RtlMove同=,慢。怎么变化这么大?
      

  11.   

    结果:
    Total Data munber is 100,000,000
    CopyMemory:21208  MoveMemory: 20683; RtlMoveMemory:19409 =:8943
      

  12.   

    看看我的测试结果(注意=):编译成.exe执行
    Total Data munber is 100,000,000 
    CopyMemory:6878 6907 6886           平均:6890.33
    MoveMemory:6883 6867 6868          平均:6872.67
    RtlMoveMemory:6874 6899 6874 平均:6882.33
    =:280 278 278 平均:278.67在VB工程中直接执行
    Total Data munber is 100,000,000 
    CopyMemory:17666 17676 17599  平均:17647
    MoveMemory:18131 18064 18057 平均:18084
    RtlMoveMemory:17695 17630 17644 平均:17656.33
    =:12045 12012 11986 平均:12017.33
    为什么“=”会有这么大的差别???
      

  13.   

    total data munber is 100,000,000copymemory:30313;30164;29792
    movememory:27120;28145;27625
    rtlmovememory:26383;27850;27855=:26383;2785;27855
      

  14.   

    呵呵,写这个东西本来是在写图像处理程序的时候突发异想出来的。于是就专门写了个测试程序。
    其实还有好多部分,这只是贴了一部分的测试代码。其实在这个测试之前,我就可以预料到结果,只是顺便一起写上而已。
    用=赋值肯定是最快的,而其他3个则应该差不多,这里我说的是同类型的变量赋值,如果是不同类型的变量会慢一些,因为VB要在后台作自动类型转换,而用其他3个函数赋值的主要时间花费在了函数的调用时间上,所以就很慢了。当然,这3个函数一般也不是这么用的,看看下面的测试就知道它们的威力了:Option Explicit
    Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
    Private Declare Sub RtlMoveMemory Lib "kernel32" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
    Private Declare Function timeGetTime Lib "winmm.dll" () As LongPrivate Sub Command1_Click()
    Dim AA() As Long
    Dim BB() As Long
    Dim I As Long
    Dim L As Long
    Dim M As Long
    Dim T(3) As Long
    ReDim AA(1000, 2000, 2)
    ReDim BB(1000, 2000, 2)M = 1001& * 2001 * 12For I = 0 To 1000
       For L = 0 To 2000
          For M = 0 To 2
             AA(I, L, M) = I + L + M
             BB(I, L, M) = 0
          Next
       Next
    Next
    T(0) = timeGetTime
    CopyMemory BB(0, 0, 0), AA(0, 0, 0), M
    T(0) = timeGetTime - T(0)For I = 0 To 1000
       For L = 0 To 2000
          For M = 0 To 2
             BB(I, L, M) = 0
          Next
       Next
    Next
    T(1) = timeGetTime
    MoveMemory BB(0, 0, 0), AA(0, 0, 0), M
    T(1) = timeGetTime - T(1)For I = 0 To 1000
       For L = 0 To 2000
          For M = 0 To 2
             BB(I, L, M) = 0
          Next
       Next
    Next
    T(2) = timeGetTime
    RtlMoveMemory BB(0, 0, 0), AA(0, 0, 0), M
    T(2) = timeGetTime - T(2)For I = 0 To 1000
       For L = 0 To 2000
          For M = 0 To 2
             BB(I, L, M) = 0
          Next
       Next
    Next
    T(3) = timeGetTime
    For I = 0 To 1000
       For L = 0 To 2000
          For M = 0 To 2
             BB(I, L, M) = AA(I, L, M)
          Next
       Next
    Next
    T(3) = timeGetTime - T(3)MsgBox "Total Data munber is 4,000,000" & Chr(13) & "CopyMemory:" & T(0) & " ; MoveMemory:" & T(1) & " ; RtlMoveMemory:" & T(2) & " ; =:" & T(3)
    End Sub
      

  15.   

    Total Data munber is 4,000,000 
    CopyMemory:0 0 0          平均:0
    MoveMemory:0 0 0          平均:0
    RtlMoveMemory:0 0 0        平均:0
    =:1734 1707   1600 平均:1680.33强,为什么会这样啊??
      

  16.   

    to  WallesCai(皮厚怎么了,摔跤不疼,冬天不冷,夏天还不怕蚊子呢!) :为什么"="在编译成.exe执行比在VB工程中运行,速度会突然慢了很多???
    看我前边的测试结果,编译成.exe执行,"="速度是其他三个的几十倍;而在VB工程中运行,速度还不到2倍...
      

  17.   

    Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
    Private Declare Sub RtlMoveMemory Lib "kernel32" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
    这三种定义其实都是调用的"kernel32"库中同一个API的不同定义形式,比如我还可如此定义:
    Private Declare Sub MemorySomeCopy Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
    只要在其中别名部份为“Alias "RtlMoveMemory"”即可
      

  18.   

    而在VB工程中运行,速度还不到2倍...
    我替楼住回答:  这时候是解释执行的,编译后是编译为机器吗执行的.用copymemory整块的复制数组确实快的不可思意,好代码,收藏起来
      

  19.   

    编译选项要选择 Compile to native code
      

  20.   

    对于单个变量或很小规模的变量数组之拷贝,用等号赋值来得更简单,并可能稍快;
    对于规模很大的变量数组之拷贝,数组成员越多,RtlMoveMemory与“=”赋值速度之比越大。
    依我的经验,“=”号赋值耗时与数组成员数大致成正比,而用RtlMoveMemory拷贝时,其耗用时间随着数据组成员数增加只有稍许增加
      

  21.   

    发现个问题:
        楼主第二个程序有问题,M = 1001& * 2001 * 12 这个地方不能用M,因为后边的循环中会将M重新赋值。这样CopyMemory BB(0, 0, 0), AA(0, 0, 0), M;MoveMemory BB(0, 0, 0), AA(0, 0, 0), M;RtlMoveMemory BB(0, 0, 0), AA(0, 0, 0), M就不是复制整个数组的4,000,000条数据了。
      

  22.   

    修改:
    dim lngLen as LonglngLen = 1001& * 2001 * 12 
    CopyMemory BB(0, 0, 0), AA(0, 0, 0), lngLen
    MoveMemory BB(0, 0, 0), AA(0, 0, 0),lngLen
    RtlMoveMemory BB(0, 0, 0), AA(0, 0, 0), lngLen
    重新测试结果:
    Total Data munber is 4,000,000 
    CopyMemory:44 41 45 平均:43.33
    MoveMemory:40 41 47 平均:42.67
    RtlMoveMemory:44 41 40 平均:41.67 
    =:1730 1661 1733 平均:1708
      

  23.   

    楼上的,这三个不是同一个函数吗?
    都是RtlMoveMemory,有什么可比的呀,其它两个不就是改了下名字嘛!