使用VB技巧解决性能危机

ZDNet软件频道 时间:2002-03-08 作者:ZDNET CHINA 特稿 |  我要评论()
本文关键词:VB
本文提供了5种性能优化技巧,当程序运行速度出现问题时,你可以在自己的程序中试一试。

VB不象C++或Delphi那样有很多致命的弱点,通常情况下,VB的性能都很优越。但是在一些特殊情况下,VB的运行速度也会很慢。本文提供了5种性能优化技巧,当程序运行速度出现问题时,你可以在自己的程序中试一试。

警告:会破坏可读性

记住,高性能通常都是以降低易读性为代价的。自己养成的编写易读、易于理解的程序的好习惯通常都是在强耗速度(耗内存,那是另外一回事)为代价。相反,我在这里所讨论的一些技巧都会使代码的易读性减弱。因此,在进行性能优化时,好好衡量一下得失并且好好看看你的源程序是非常重要的,否则,当以后的程序员再看你的源程序时将会一头雾水。

奇怪的Gosub

我相信大家都知道Gosub是非常麻烦的,应该不惜一切代价避免。从易读性和再使用角度以及把程序代码放到自己的子程序或函数方面考虑,这是可以接受的。但是一定要记住我提供的这些性能优化的小建议是以降低程序易读性为代价的。把常说的非常有用的sub或Function用一套采用Gosub编写的本地子程序来代替,在程序运行的时候,速度就会提高3倍。

为什么会这样呢?因为调用一次函数就要进行一次处理。这是VB所独有的,因为VB必须要保证调用代码的内容(象变量值、当前执行点以及其他一些东西)、把一些东西放入堆栈以及在调用函数前要把函数的调用点发到内存中去。然而,本地子程序就没有这些繁复要求:不需要可变堆栈。

当然,通过编写函数或sub中的任意代码都可以获得同样的效果。但是,如果你接手的是一套完整的、但运行速度非常慢的程序,那么你可以很容易的把Gosub块拷到程序中,而不需要重新编代码。

选用合适的变量类型

编代码时,一定要确信声明的变量类型合适,例如,不要把一个循环变量声明为变量,用一个本地数字类型来代替。同理,在处理object时,你可能想用object的实际类型来代替一般object类型,这样就可以充分利用先前绑定的优势。

我承认上面提到的这些都非常明显,但是,不知道你是否知道所有数据类型都不是等价产生的,之间的差别是与直觉相反的。例如,对于一个For… Next循环来说字符(1个字节)形循环变量就要比整形(4个字节)循环变量花稍微长一点儿的时间。

关于循环

我们一直讨论的都是For循环,当处理collection或者其他object类型时,就不能用For… Next而只能用For Each… Next了。因为后者要比前者快大约33%。

原因非常简单,若使用For EachVB只需在循环开始时指定object变量地址一次。若使用的是For … Next,在每一次循环过程中循环体中的object变量都要重新赋值。使用with语句结果与此基本相同。

使用GUI更新

使用VB开发GUI非常简单,因为控件本身已经为你设计好了,你只需在VB中做正确的设置,系统就会自动为你更新界面。不幸的是,当运行一个大的控件更新操作时,当一次更新后控件又重新更新界面时,那些平时非常好用的小工具就会对你反咬一口,大大降低了处理速度。

表格和图形控件都有自动更新功能,在你工作时,可以把这些功能先关掉。怎样才能使其他控件也不发挥自动更新功能呢?

Windows message API为此提供了解决方案,通过使用SendMessage API函数,可以把WM_REDRAW (&HB)发送到一个控件中,从而控制它的自动更新功能。把wParam置为False或零,就可以关掉自动功能,置为True或者任何非零整数就打开自动功能。这样做除了能提高控件格式化操作的速度之外,还可以使应用程序看起来更加简洁。


一条信息

关于Windows messaging API及其功能的更多信息可以查看"Tap into hidden VB control functionality using SendMessage."



百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134