VB6 中 善用 ByRef 提升速度

速度

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

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

这就给了我们优化得机会。结合以前写得

善用 API 的SendMessage 来提高 插入 VB.ComboBox Item 的速度

我又重新使用该代码 分别测试了一下 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

时间: 2024-09-28 01:18:37

VB6 中 善用 ByRef 提升速度的相关文章

VB6 中使用错误处理对于速度的影响

错误|错误处理|速度   在 VB6 中,我们使用 On Error 来捕获和处理错误,而且经常使用 On Error Resume Next 来可能产生的忽略错误. 那么 使用错误捕获是否会影响速度呢? 是的,使用错误处理将会降低一些性能,在.Net 中,使用 Try Catch 也将会影响性能,所以我们使用 Reflector 反编译微软的类库时,会发现他的子过程很少使用 Try 来捕获错误,基本都是采用可预知的方式来判断可能出现的错误,并做相应处理. 实际上,使用错误捕获后,编译后的代码实

硅谷杂志:浅析WCDMA网络工程中的容量提升策略

[硅谷网11月17日文]据<硅谷>杂志2012年第17期刊文称,随着http://www.aliyun.com/zixun/aggregation/26684.html">通信技术的发展,移动通信技术的发展高峰时期即将来临,在传输上结合有线和无线的方式.WCDMA网络 具备容量高.传输速度高而且低功耗等特点,得到移动通信运营商的关注.但是容量的提升是移动通信必须首要解决的问题.分析WCDMA网络工程中的容量,提出几种提升策略的方法,对于现在的WCDMA网络工程中的容量提升方案的

千兆宽带:是为了速度而提升速度吗?

在今年的宽带世界论坛(BBWF 2016)上,有很多关于千兆宽带(Gigabit broadband)的激烈讨论:驱动力.技术选择.赚钱机会以及对家庭网络产生的影响. 千兆宽带在一些国家已经进行了部署,Ovum预计部署数量在2017年将会继续增加.在包括新加坡等一些发达国家市场,Ovum预计到2020年千兆宽带将占据全部宽带线路的超过65%. 围绕赚钱的大问题仍然存在 毫无疑问,固定宽带带宽正在增加.根据Ovum的最新消费者预测,到2021年,全球20%宽带用户的宽带速度将至少达到100Mbps

VB6中水晶报表(Crystal Report 4.6)的使用经验

水晶报表 我第一次接触水晶报表是在2001年3月在我的同事尹晓祥同志开始接触水晶报表的. 水晶报表(Crystal Report 4.6)只支持Access97格式的数据库, 所以,先在Access2000格式中设置好表与表的关 系,再把表转换到97格式,在水晶报表中调入97数据库后,在Links中自动会找出表间的关系. 水晶报表在VB的安装盘中已自带了. 路径: COMMON\TOOLS\VB\CRYSREPT\CRYSTL32.EXE系列号: 1231467890安装后,运行路径: \Pro

在VB6中动态创建使用ADO控件访问数据库

ado|创建|动态|访问|控件|数据|数据库 使用ADO控件可以方便的在VB6中访问ODBC数据库,但是通过直接放置ADODS控件来获得ADO的数据连接比较麻烦,我们可以在VB工程中创建一个公共数据模块,将ADO控件的初始化.建立连接.关闭连接等操作都写到函数中,这样就可以在工程的其他模块中共享调用这个ADO连接. 一次完整的ADO调用操作分为如下几个步骤: 打开ADO到数据库的连接,初始化ADO RECORDSET集. 通过写入SQL语句执行查询并返回查询结果RECORDSET集:或者可以通过

如何加快Windows中的菜单显示速度

  法一: 加快Windows中的菜单显示速度步骤: 1.选择"开始"选单的"运行",键入"regedit"启动"注册表编辑器". 2.运行注册表编辑器,进入"HKEY_CURRENT_USERControl PanelDesktop",找到MenuShowDelay数据项. 3.将名称为MenuShowDelay的数据值由原来默认的400修改为0,修改后XP的开始选单.甚至应用软件的选单显示速度都会明显加

时间复杂度-为什么Python中dict的查找速度和list一样?

问题描述 为什么Python中dict的查找速度和list一样? 用Python写了段程序,其中一部分是在2^20个数据中的查找,可是用dict实现起来慢, 后来发现改用list后竟然和之前的速度一样,请问这可能是什么原因呢?代码在这里 (http://ask.csdn.net/questions/224028 "") 解决方案 python的dict速度python dict listpython list与dict 解决方案二: 已解决,是我弄错了.

VB.net中能否实现相当于VB6中的异或绘图功能?如何实现?请高手指点!

问题描述 VB.net中能否实现相当于VB6中的异或绘图功能?如何实现?请高手指点!

在vb6中如何导入excel文件

问题描述 在vb6中如何导入excel文件?导入后按照不同的算法将数据进行计算后在界面上输出显示 解决方案 解决方案二:汗~忘了给分解决方案三:MSDN里有的吧,我这没有装vb6,给你vb.net的资料看看,基本差不多DimDSAsSystem.Data.DataSetDimMyCommandAsSystem.Data.OleDb.OleDbDataAdapterDimMyConnectionAsSystem.Data.OleDb.OleDbConnectionMyConnection=NewS