MyException - 我的异常网
当前位置:我的异常网» VB » 求高效率的取高字节VB6的函数

求高效率的取高字节VB6的函数(2)

www.myexceptions.net  网友分享于:2013-04-10  浏览:25次

    
    MsgBox "pSA=" & Hex(pSA)
    
    Call CopyMemory(pvDataOld, ByVal pSA + 12, 4)   '保存之前真数组的指针
    Call CopyMemory(ByVal pSA + 12, myLong, 4)      '设置myLong的指针为真数组指针
End Sub

Private Sub FreeArray()
    '恢复原来申请的真数组指针,并释放数组
    '
    Call CopyMemory(ByVal pSA + 12, pvDataOld, 4)   '恢复myLong的指针为之前申请的真数组指针
    Erase myIntegerArr()
End Sub
------解决方案--------------------
引用:
最快就是不经过运算,直接取每个字节的内容,就是C里面的联合体union.

VB里不支持联合体,所以想要使用这个功能得绕点弯,操作SafeArray来实现,但最终效果是一样的.

Visual Basic code?123456789101112131415161718192021222324252627282930313233343536373839404142……

支持一下先,不过不是很懂为什么要绕那么多弯?看代码是用MyLong的地址指针替换掉myIntegerArr数组的地址指针,不知道可不可这样:

Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub Command1_Click()
  MsgBox Hex(aGetLongHigh(&HAABBCCDD))
  MsgBox Hex(bGetLongHigh(&HAABBCCDD))
End Sub

Private Function aGetLongHigh(ByRef mLong As Long) As Integer
  Dim MyBit(3) As Byte
    Call CopyMemory(MyBit(0), mLong, 4)
    Call CopyMemory(aGetLongHigh, MyBit(2), 2)
    Erase MyBit
End Function

Private Function bGetLongHigh(ByRef mLong As Long) As Integer
  Call CopyMemory(bGetLongHigh, ByVal VarPtr(mLong) + 2, 2)
End Function

好像结果也是对的,但是不知道效率上有什么区别没有?哪位大大愿意解释一下吗?谢谢……
------解决方案--------------------
引用:
支持一下先,不过不是很懂为什么要绕那么多弯?看代码是用MyLong的地址指针替换掉myIntegerArr数组的地址指针,不知道可不可这样


差别很大,HOHO.

我绕那么多弯,目的是让myIntegerArr()与myLong都指向同一个地址,类似C语言中的union.

一旦这一步完成,以后要取myLong的高低字时,直接到myIntegerArr()中取就行了,因为myIntegerArr()中已经就是myLong的内容了,因此除了赋值操作,没有别的操作了.

而你的方法应该就是楼主所说的内存复制法,要调用多次API,虽然API很快,但是调用开销加上执行开销,肯定是比联合体慢得多的.
------解决方案--------------------
兴起,做了个测试.

注意,测试全都是编译后的结果.在IDE中我这里申请内存失败了,估计是没那么多的逻辑内存了.

把电脑设置为最高性能模式,不做编译优化,结果如下:

生成1亿个LONG随机数=45047ms,提速17%
模拟union方案=1203ms,提速21%
zGetLngHigh方案=4469ms,提速27%
GetHiWord方案=6531ms,提速44%
aGetLongHigh方案=46797ms,提速37%


电脑性能设置为之前的自动,再把编译选项中的高级优化全勾上,结果如下:

生成1亿个LONG随机数=54719ms,降低3%
模拟union方案=1094ms,提速33%
zGetLngHigh方案=5281ms,提速7%
GetHiWord方案=8015ms,提速17%
aGetLongHigh方案=59641ms,提速7%


电脑性能设置为最高性能,再把编译选项中的高级优化全勾上,火力全开了,结果如下:

生成1亿个LONG随机数=41015ms,提速29%
模拟union方案=703ms,提速107%
zGetLngHigh方案=4094ms,提速39%
GetHiWord方案=5890ms,提速60%
aGetLongHigh方案=46515ms,提速37%

有点意思,哈哈.

看来编译优化对于性能的提高还是很明显的啊.

不过对函数的调用几乎就没什么用了,比如生成随机数组时,RND函数是VB6内部已经编译好的,不会再二次编译了,所以没什么效果.
------解决方案--------------------

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有