程序如下: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次以上结果的平均值。
给出结果者均有分!
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次以上结果的平均值。
给出结果者均有分!
解决方案 »
- jhone99请进,还有问题请教
- vb 连续导出EXCEL表问题 第一次可以保存,第二次在保存语句报“对象变量或 With 块变量未设置”错误。并EXCEL进程未关闭。高手解答,代码如下!
- 为什么客户端接受的数据延时那么长,要5,6秒才显示在文本里
- 有沒有辦法用實現QQ的遠程桌面?
- 如何获取rs数据集里的数据?
- 判断text中的字符串是否含有回车,并取回车前的字符串(白给分哦)
- Vb.netDate型转换
- 美化窗体
- 那儿有 dicx7.0下载罗
- 有关treeview的两个很实际的问题!
- 在api函数中用到得一些常量的定义怎么查看?
- 100分求助!写入大量数据时,如何让计时器显示操作的时刻,不至于程序界面象是死机!
怎么回事?
结论是一样的~
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次以上结果的平均值。
给出结果者均有分!
软件环境: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
改正一下:
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
第2次:Copy快,Move中速,RtlMove同=,慢;
第3次:Copy中速,Move快,RtlMove同=,慢。怎么变化这么大?
Total Data munber is 100,000,000
CopyMemory:21208 MoveMemory: 20683; RtlMoveMemory:19409 =:8943
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
为什么“=”会有这么大的差别???
movememory:27120;28145;27625
rtlmovememory:26383;27850;27855=:26383;2785;27855
其实还有好多部分,这只是贴了一部分的测试代码。其实在这个测试之前,我就可以预料到结果,只是顺便一起写上而已。
用=赋值肯定是最快的,而其他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
CopyMemory:0 0 0 平均:0
MoveMemory:0 0 0 平均:0
RtlMoveMemory:0 0 0 平均:0
=:1734 1707 1600 平均:1680.33强,为什么会这样啊??
看我前边的测试结果,编译成.exe执行,"="速度是其他三个的几十倍;而在VB工程中运行,速度还不到2倍...
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"”即可
我替楼住回答: 这时候是解释执行的,编译后是编译为机器吗执行的.用copymemory整块的复制数组确实快的不可思意,好代码,收藏起来
对于规模很大的变量数组之拷贝,数组成员越多,RtlMoveMemory与“=”赋值速度之比越大。
依我的经验,“=”号赋值耗时与数组成员数大致成正比,而用RtlMoveMemory拷贝时,其耗用时间随着数据组成员数增加只有稍许增加
楼主第二个程序有问题,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条数据了。
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
都是RtlMoveMemory,有什么可比的呀,其它两个不就是改了下名字嘛!