vb6提速技巧之一 等长的和非等长的大数组的复制

编程心得 专栏收录该内容
4 篇文章 0 订阅
由于vb6的先天缺陷,导致我们在vb6中构造某些常见的数据结构非常困难,比如要在vb6中构造一个链表。而有些情况下,由于程序的需要,我们需要这种可变长的有序集合,当然,vb6中也有集合,可以用for  each来遍历,但是由于这种集合的无序性,使得我们在处理大数据量的时候效率变得十分低下。很多时候,我们真希望数组有集合的某些的性质,比如,从数组中移除某些元素后,它又自动生成一个连续的数组,可惜,vb6没提供这样的功能,,有时候我们可能为了一个元素的变动,而去遍历复制整个数组,即麻烦又效率低下。既然,vb6非要我们复制不可,那么下面我们就来探讨一下如何提高数组复制的效率。
vb6中的数组是可以直接通过数组名来进行整个数组复制的。
例如 :
dim  a()  as   long  ,b()  as   long
dim  i  as   long
   
redim  a( 1000 )
   
for  i = 0   to   1000
        a(i)
= i
   
next
   b
= a   ' 直接把a复制给b,这个方法适合所有的数据类型,包括自定义类型,只要这两个数组的数据类型相同,

下面的例程给出了非等长的大数组的复制的方法:
Private  Declare  Sub  copymemory Lib  " kernel32.dll "  Alias  " RtlMoveMemory "  (ByVal des  As   _ Long ,ByVal suc  As   Long , ByVal lens  As   Long )
Private   Sub  Command1_Click()
  
Dim  a()  As   Long , b()  As   Long
  
Dim  i  As   Long
  
Dim  t1  as   single ,t2  as   single
   
ReDim  a( 3000000 )
     
For  i  =   0   To   3000000
       a(i) 
=  i
     
Next
     t1 
=   Timer
     
ReDim  b( 2999980 )                                                                    ’以下的代码是,把a从第57项至第                                                                                                                  2999981项复制给b
      copymemory VarPtr(b(
0 )), VarPtr(a( 56 )), ( UBound (b)  +   1 *   4      ' 当数组是string类型的时候,有时候                                                                                                                会出现 非法内存读写的错误,
     t2  =   Timer   -  t1                                                                        ‘导致vb6的IDE崩溃,但是debug出来的数值                                                                                                           表明数组复制成功,
     Debug.Print b(
444444 ), t2                                                  ’现在还不知道原因,如果有朋友知道,麻烦                                                                                                               告知我,
End Sub


一些经验:  在vb6中处理速度最快的数据类型除了byte 就是long,这可能跟32位寻址有关系,windows处理数据的时候默认为4个字节一个单位段,详细原理我不知道,麻烦知道原理的朋友告知我,所以,少用integer。

’测试结论:

    1。在进行数组复制的时候,string类型比long型的要慢4倍左右(元素越多,比例越大),我以120万项为例,用for来复制,string型花费0.57秒,long型只要0.14秒。

2。用copymemory来复制大数组,好象跟复制元素的多少没有太大的关系,120万项跟300万项用时大概都在0.031秒的样子,300万项long型用for来复制是0.35秒,我也用string型试了一下,用for复制300万项左右,我实在是没耐心等,太慢了。。。
如果上述方法有错误或遗漏,欢迎大家批评指正。如果你觉得还可以,请顶一下吧  ;)
(如需引用,请著明出处,谢谢合作!)

  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

forbearORfolie

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值