VB6 中 善用 ByRef 提升速度

通过对比ByRef和ByVal在VB6中调用API的效率,发现ByRef在某些情况下能提高代码执行速度达16倍。示例代码展示了在添加ComboBox字符串时,使用ByRef的明显优势。但需要注意,不是所有API都适合使用ByRef,需考虑API内部是否修改参数或后续是否继续使用参数。
  和.Net 中不同,VB6 中默认是使用 ByRef 来传递参数了,看来似乎没有什么可以优化得地方。

可是,实际上 如果你调用 API 得话,从 API浏览器复制下来得代码却是 强制使用 ByVal 传参得

这就给了我们优化得机会。

我又重新使用该代码 分别测试了一下 ByRef ,ByVal 得区别,结果很振奋: ByRef 比 ByVal 提高了16倍

代码如下,插入ComboBox 得字符串越长,越能显示 ByRef 得威力

Option Explicit
Private Declare Function SendMessageByRef Lib "user32" Alias "SendMessageA" (ByRef hWnd As Long, ByRef wMsg As Long, ByRef wParam As Long, ByRef lParam As Any) As Long
Private Declare Function SendMessageByVal Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long

Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Const CB_ADDSTRING = &H143
Private Sub Command1_Click()

Dim II As Long
Dim t As Long
Dim s As String

Combo1.Clear
t = GetTickCount()

'使用API ByRef
For II = 1 To 10000
s = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
重新赋值以改变地址
SendMessageByRef Combo1.hWnd, CB_ADDSTRING, 0, s

Next

MsgBox "ByRef " & GetTickCount - t

Combo1.Clear
t = GetTickCount()

' 使用API ByVal
For II = 1 To 10000
s = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
SendMessageByVal Combo1.hWnd, CB_ADDSTRING, 0, s

Next

MsgBox "ByVal " & GetTickCount - t

Combo1.Clear
t = GetTickCount()

' 使用普通 ComboBox Add
For II = 1 To 10000
s = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
Combo1.AddItem s

Next

MsgBox "ComboBox Add " & GetTickCount - t

End Sub

      

将 API 传参方式改为 ByRef ,可以提升速度,当然不是所有得API 得参数都能这么改,具体得看 API 函数内是否会对传入得参数进行修改,或者你是否还要继续使用 被传入得参数。

否则会引起一些错误,而有些API 是不允许使用 ByRef 传参得 .具体情况还得具体分析。当然上面得列子完全可以使用 Byref 

摘自:网络整理

 
 

VB相关

 
 

VB6 中善用ByRef 提升速度

[vb] Set 语句

VB_Format自定义格式

VB如读取内存地址

vb FindwindowEx的用法实例

进制转化进10进制数

收藏:如何获取当前已经打开的IE对象(VB6代码)

DXInput中键码的转换(VB6.0代码)

如何在VB6.0里动态使用具有事件的对象

[vb]格式输出Format函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值