VB6 中 善用 ByRef 提升速度

2016-01-29 13:31 21 1 收藏

VB6 中 善用 ByRef 提升速度,VB6 中 善用 ByRef 提升速度

【 tulaoshi.com - ASP.NET 】

  和.Net 中不同,VB6 中默认是使用 ByRef 来传递参数了,看来似乎没有什么可以优化得地方。

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

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

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

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

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

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

来源:http://www.tulaoshi.com/n/20160129/1490469.html

延伸阅读
iPhone用久太卡 10个提升速度的方法   手机用久了,大量的垃圾文件导致手机越来越卡,iPhone也会有这种情况。如果手机非常卡顿的话不妨试试www.tulaoshi.com下面10招,会让iPhone运行速度提升不少哦。 1、清空Safari缓存 经常使用 Safari 浏览网页时间久了会产生大量缓存数据,需要清空Safari的缓存来保持它的运行流畅。想...
嘿嘿,看到这个题目,想必吓了一大跳吧,或者是摆出一副不相信的表情?不用着急,请听我慢慢道来。 话说这个VB6,很是无耻,居然内置了支持Unicode的功能,也就是说,当你读入一个字符串时,它根据本地缺省语言的对应关系将之转换为Unicode,输出时,再从Unicode转换为本地编码。一方面,它当然方便啦,随便出个什么语言的版本都好方便的,...
我们在玩《仙剑奇侠传》时,要是不能保存数据,那么非得挑灯夜战三昼夜才能玩完,可见数据存储之重 要性。爱好编程的CFAN是不会放过数据文件的,下面跟着我驰骋吧!我们先吃一个哈密瓜,开门即来编一传统的比较有代表性的程序,不可不看的哟! 程序分为一个表单cfanvb.frm,一个模块cfanvb.bas。一个表单程序。程序的表单中有五个命令按...
首先,建立一个新的带有窗体的VisualBasic6工程,然后在窗体中添加一个TreeView控件,并添加一个引用到微软XML解析器。 接着,在Form_Load事件中添加如下的代码: PrivateSubForm_Load() DimobjDOMAsDOMDocument SetobjDOM=NewDOMDocument CallobjDOM.loadXML(_ "") CallAddNode(objDOM.documentElement,Nothing) SetobjDOM=Not...
在VB6中动态创建使用ADO控件访问数据库 使用ADO控件可以方便的在VB6中访问ODBC数据库,但是通过直接放置ADODS控件来获得ADO的数据连接比较麻烦,我们可以在VB工程中创建一个公共数据模块,将ADO控件的初始化、建立连接、关闭连接等操作都写到函数中,这样就可以在工程的其他模块中共享调用这个ADO连接。 一次完整的ADO调用操作分为如下几个步骤...

经验教程

578

收藏

57
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部