VB《葵花宝典》--指针技术,快写完,看看先。
老熊宝宝 2002-02-27 11:30:07 这几天没来CSDN,我没闲着,我在深入研究VB指针技术。
有这个想法,是因为在写《API/COM调用,VB文档里没有东西》
时出了问题,我写了一万四千多字,连API调用的问题都没有谈
完,而且由于写之前没有计划,结构很乱,于是我决定完全重写
并把这些内容分成三篇文章来谈,《VB《葵花宝典》--指针技术》
已经基本写完。这篇文章的目的,就是要在VB里尽可能引入指针
技术。
为了写好这篇文章,这五天来我进行了深入的研究,跟踪、
测试、改进代码、研究可行性。
我的结论是:在VB里有很多地方使用指针技术可以大大提高
程序性能,不需要写用别的语写DLL,就在VB里我们也可以。
为了研究可行性,我甚至完全用指针技术实现了动态存储分配的
带头结点的单向链表。为比较性能,我在VB里分别用堆栈HeapAlloc、
虚拟内存VirtualAlloc,和原来的内存映射文件技术实现Malloc/Free
的内存动态分配功能,最终的决定还是使用和C库一样堆栈技术来实现
Malloc/Free。
虽然最终的程序需要反复用CopyMemory在动态申请的内存和
VB能直接使用的自定义类型变量之间拷贝数据,但另人吃惊的是,
最后实现的指针链表性能和用对象实现的链表基本一样,在节点
数小于10000时,指针链表甚至比对象链表还要快一点点。
当然,这一点点的提高不能说服我们去使用动态内存分配,虽然
可行性上失败了,但是我证明了可能性。在使用有些需要调用程序提
供缓冲区的API时,我们除了Byte Array和String外我们又多了一种
选择,我的实验证明用堆栈HeapAlloc还是有价值的。
无论如何,我的这篇文章敢称《葵花宝典》,肯定得拿出些更
有说服力更有实用价值的东西。在VB里指针我已证明至少有两点应用
还是非常有价值的,一是交换指针而不交换数据的技术,下面的SwapPtr
比SwapStr快1倍,这是很可观的;二是直接在数组里搬数据而不用VB的
数组下标来做,在数组较大时这种做法在效率上的提高非常可观。
'用指针的SwapPtr
Private Declare Sub CopyMemory Lib "kernel32" Alias _
"RtlMoveMemory" (Destination As Any, Source As Any, _
ByVal Length As Long)
Sub SwapPtr(sA As String, sB As String)
Dim lTmp As Long
CopyMemory lTmp, ByVal VarPtr(sA), 4
CopyMemory ByVal VarPtr(sA), ByVal VarPtr(sB), 4
CopyMemory ByVal VarPtr(sB), lTmp, 4
End Sub
'用StrPtr上面的程序还可以更快。
'标准的做法SwapStr
Sub SwapStr(sA As String, sB As String)
Dim sTmp As String
sTmp = sA: sA = sB: sB = sTmp
End Sub
在我的机器上:
运行100000次,SwapStr需要170毫秒,SwapPtr需要90毫秒。
运行200000次,SwapStr需要340毫秒,SwapPtr需要170毫秒。
运行2000000次,SwapStr需要3300毫秒,SwapPtr需要1500毫秒
'搬数组:
Dim value(20) as MyType
假设数组已经有数据,现要从第1个元素开始的10个元素需要顺序
后移到第11个元素开始的10个元素。
'用指针两句话:
CopyMemory ByVal VarPtr(value(11)), _
ByVal VarPtr(value(1)), _
10 * itemLen
ZeroMemory ByVal VarPtr(value(1)), 10*itemLen
以上简单谈了一下这几天的成果,只是要告诉大家我没来CSDN也没闲着
,如果有VB里比较有挑战性的问题,请给我来信,
我的地址:xcbear@netease.com
需要说明,不是我不愿意回答VB文档里就有的问题,因为如果我
这次回答了,你就失去了一次自己解决问题的机会。
比如关于API的问题实际上有很多在不停的重复,问人之前请查一
查先。
-微软非官方技术研究自由人,VB非官方技术支持
本贴子仅供参考。本人不提供数据库、VB文档已有说明的和任何未经思
考的技术问题之支持。若你有百思不得其解的问题,请给本人发短消息
或写信。
我的地址:xcbear@netease.com