学习VB差不多一个月了,最近想试试做平时自己常用的个小软件,因为上次发贴得到前辈们的提点,遇到难点先看书再找找资料,不要一遇到问题就上来问,这样很难学到本事,这提点真的有用,以前不明的地方自己慢慢可以找到解决方案,而且是印象比较深。但这次花了好几天时间真的没办法解决,其它的问题基本自己解决了(当然是指我的水平内),请大家帮帮忙!!我想做的那个软件,在做前已定好架构,分开运行起来是可以,但就是有些地方太慢了软件是要计算一种物质的各种值,数据量比较大,但运行慢不是慢在运算过程,反而是慢在字符的连接过程,下面是例:
以前我是用一个变量 a来奖一系列(过百万条)的数值,这样太慢,最后换了用百万个动态数组来把一个值装起来,算解决了
速度的问题,但问问题是出自己我的数组a()string,是在循环中产生,每次循环有十个不同的值,分别是h1,h2,h3,h4,h5.....h10我在循环里用 a(ser)=h1 & h2 & h3 & ........h10然后再   量.Text = Join(a)   把数据导出但运行太慢了,我原来以为是循环(里面还有判断)太多使每次的数组赋值太慢,但我测试过,把循环里的判断改为一个实数值,这样速度也是一样,最后才查出原来是a(ser)=h1 & h2 & h3 & ........h10把整个过程速度拉下来,我试了把a()改为数值型,h1 + h2 + h3 ....也改为数值,相加运算,这样一个300多万个数组产生出来也不到十秒,可以用了连接符 &  连接,需要差不多10分钟才能完成连接,  量.Text = Join(a) 分解也只是几秒的事,在网上找还是找不到怎样替换 用 & 的办法,因为我只是初学,数据库,API这些都不会,希大家指教一下,最好是有注解释的,不要用太深的函数看不懂
(因为我的原代码中有些数据不能放上网,所以只能做个例,如我说得不清我再补充说明)
还有点,数据太大不能在TXT里显示,有没有其它显示出来的控件,我见有些软件,在显示框中达到500项就会加一个新页,所以多大数据都可以显示的。   

解决方案 »

  1.   

    学来真的需要下决心学习了,不要见笑,我的数据比如上面的问题解决了,后面还要进行再赋值计算平均值或特殊运算的比如a(1)中的h1, 是量,再在别一个计算中给它一个量化的值,而H1-H10都要进行这一步,再可以进行下步的计算,最后还要计算每种物质[a()]量化后排序位置,最后如果是一个值例如是1.45368827,对比计算后的数组里那一条数据相同就导出那一组数据,计算量真的很大,是不是一定要用数扰库才能完成?现在我用质环都要用上11个内外循环才能得出一组H1-H10的数据!!!!
      

  2.   

    for  tx=1 to  5
        if tx=1 h1=1.233 then
          end if
            if tx=2 h1=4.658then
          end if
              if tx=3 h1=0.5537then
            end if   for  tx1=1 to  4
          if tx1=1 h2=1.233 then
          end if
            if tx1=2 h2=4.658then
          end if
              if tx1=3 h2=0.5537then
            end if      for tx2=1 to 6
            if tx2=1 h3=1.233 then
          end if
            if tx2=2 h3=4.658then
          end if
              if tx2=3 h3=0.5537then
            end if
                for ....
                ....            一共有10个这样的需判断的循环,这里略去
                  for。这是第十个
                  a(ser)=h1 & h2 & h3........& h10就是这里太慢,如果不是&连接,换成运算,例如加减这样速度没问题,就是&连接太慢,可能是次数太多吧,我试过省去循环里的判断直接给H条个一个实数值,再连接,也是一样慢,所以我觉得不是是&出问题,不知能不能解决next ..
      next ..
       next ..........
      

  3.   

    如果追求代码简节,
    if tx1=1 h2=1.233 then
      end if
      if tx1=2 h2=4.658then
      end if
      if tx1=3 h2=0.5537then
      end if可以换成choose,但速度并没有得到提高,比如:
    h2=Choose(tx1, 1.233, 4.658, 0.5537)
    速度慢的原因是循环过多,从代码上看,你的逻辑思路有问题,需要优化一下。
      

  4.   

    h1、h2、h3这些既然是字符串,就预先定义好string类型,别老是让vb帮你转换类型,估计速度会有所提升。
      

  5.   

    类型方面是先定好的,上面只是一个比如,a()我为了下面用Join,所以定为一个长字符,h的各值也是定为定为字符型,(我为了速度的事试过把数据改双精度,对速度也没帮助)江大哥说的,我觉得是有道理的,我也没见过有人要用这么多的循环,可以里面是有一个i=i+1来计算循环的次数的,我的原代码只要不加入a(ser)=h1 & h2 & h3........& h10这个,五秒左右就可以完成差不多400万次数的循环了,而如果把&连接换成算术计算(当然是类型也转了)就算也不算慢呀,我会的方法都试过了,我还试过把全部类型改为%整形,给个假定值,不进行判断,只进行循环连接,结果也是一样,跑不起来,所以我才坚信是&问题,也试过不把H1-H10进行连接,只从H1-H5开始,速度就快差不多倍多了,真的没办法了,求助下大家,谢谢江大哥
      

  6.   

    http://www.vbaccelerator.com/home/vb/code/techniques/StringBuilder/article.asp
    先试试这个StringBuilder,看能不能提高效率?
      

  7.   

    谢谢10楼的朋友,可惜英文水平太差,看不明。真的是被一粒(玉米)玩死了刚才又试一下,500万注循环不用判断的情况下大约用了22分钟,同样500万注循环不用判断的情况下不做那个&连接用了7秒完成,     但发现Join在超过400万时输出到text就报溢出。当然text控件也不能全接收,我只是试试在网上看到一位朋友写了关于用&慢,用一些方注去代替多次循环连接的贴,但里面提到用substr函数,VB里能用substr函数吗?我试了一下都说末定义,真的搞不懂,按贴里说10000注循环用substr的一表达式来代替重复连接会快大约25赔左右,不知是环是真的,可能是我不懂吧。不知还有没有一些单间点的方法,无耐首等软件运行时可真的不好过
      

  8.   

    楼主理解有误,并非用+就速度快,而 用& 速度就慢;真正的原因是数值计算处理本来就比字符串处理速度要快得多。
    +也可作字符串连接符,你可以试试,速度一样不会快,因为你在处理字符串。
      

  9.   

    计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
      

  10.   

    将字符串连接
    dim s as string
    s=s+"a"
    s=s+"bb"
    s=s+"1234"
    改为往定长字符串数组赋值
    dim s(1 to 3) as string*4
    s(1)="a"
    s(2)="bb"
    s(3)="1234"
      

  11.   

    不过上例中输出时如果想去掉每个s()后面多的空格要用rtrim函数
      

  12.   


    谢谢两前辈是的呀,就是字符型处理实在太慢了,楼上大哥说的改为定长字符的方法也试过了,过程时间差不了多少,考滤到后面会用到 Join,所以长用string,本以为能过这一步下面的就单纯的数学运算了,不会太慢,可惜一晚通宵尝试一下下面的运算,跟本没法跑动,排序排了一个小时还没排好,我是用请教一下前辈们学习数据库有什么好书或网上资料参考一下。最终想得到计算结果:玉米   各种不同的含量值   分为含量 和 含量的量化两个值, 得到值后一起排序,量化值为一个标准值,比如导入花生的量化值,对比一下玉米的量化值,把相同或指定范围比例内的玉米含量值找出来进行对比分分析
      

  13.   

    我用的排序是冒泡法,这是我的代码             不知用其它方法进行排序会不会快点,这里我用了两组对应数据一起排序
    ' Dim ssp#, jt&, js&, xxp$
    'For jt = 1 To 4342256
       'For js = jt + 1 To 4342257
      'If pdy(jt) > pdy(js) Then                '此排序方法是从数组第2个对比第一个,对比完全部后完成内
    'ssp = pdy(jt): pdy(jt) = pdy(js): pdy(js) = ssp  '循环的一次得出最小的一个数,那就是外循环的第一次就是最小,最后一次就是最大
    'xxp = rex(jt): rex(jt) = rex(js): rex(js) = xxp
     'End If
       'Next js
    'Next jt
      

  14.   

    显示数据我觉得你完全可以写入txt文件中,作为日志文件,自己想看时再打开
      

  15.   

    关于排序
    小于10000用冒泡
    小于100000用qsort
    小于1000000用数据库(B+树索引)
    大于1000000没遇到过。用哈希、归并?
      

  16.   

    text放不下,可以换richtextbox,
    数据库书,参考这个
    http://topic.csdn.net/t/20030127/16/1395771.html
      

  17.   

    俺没看懂LZ想干啥,不过处理大字符串推荐使用Byte()类型数据,然后一次或者分几次RtlMoveMemory,显示就使用StrConv到String
      

  18.   

    StringBuilder 是大量字符串连接必备的。
    英文不好找工具去翻译。
    再不行将左上角的例程下来了看总会吧。其实只要学会怎么调用 StringBuilder 这个类就可以了。