ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3688|回复: 9

[讨论] vb.net运行时间

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-11-16 12:51 | 显示全部楼层 |阅读模式
在vs2010下用vb做了一个窗体,加个按纽,写如下代码,结果运行时间为13.4135s........   
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim brr()
        Dim timer As New Stopwatch
        timer.Start()
        For i As Integer = 0 To 65536
            ReDim Preserve brr(i)
            brr(i) = Rnd()
        Next
        timer.Stop()
        MsgBox(timer.Elapsed.TotalSeconds)
    End Sub
在vba中,完全一样的程序,运行时间是0.1796s........
Sub aa()
Dim brr()
ti = Timer
For i = 0 To 65536
ReDim Preserve brr(i)
brr(i) = Rnd()
Next
MsgBox Timer - ti
End Sub

TA的精华主题

TA的得分主题

发表于 2012-11-16 13:24 | 显示全部楼层
vs对数据类型要求很严格,最好明确定义数据类型,改为Dim brr() As Single应该可以缩短一些时间

TA的精华主题

TA的得分主题

发表于 2012-11-16 13:38 | 显示全部楼层
本帖最后由 wpxxsyzx 于 2012-11-16 13:42 编辑

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim i As Integer
        Dim brr(65536) As Single
        Dim timer As New Stopwatch
        timer.Start()
        For i = 0 To 65536
            'ReDim Preserve brr(i)
            brr(i) = Rnd()
        Next
        timer.Stop()
        MsgBox(timer.Elapsed.TotalSeconds)
    End Sub
'ReDim Preserve 惹的祸,最好先确定数组大小

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-16 13:42 | 显示全部楼层
wpxxsyzx 发表于 2012-11-16 13:24
vs对数据类型要求很严格,最好明确定义数据类型,改为Dim brr() As Single应该可以缩短一些时间

以下为测试结果:
改为single(占4个字节):7秒
改为double(8个字节):17秒
改为dicimal(16个字节):37秒
改为integer(4个字节):7秒
改为short(2个字节):3秒
看来数据类型在vb.net中对运算速度有巨大影响!
谢谢wp版!

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-16 13:44 | 显示全部楼层
wpxxsyzx 发表于 2012-11-16 13:38
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button ...

我之前也有测试过redim preserve,如果不加的话运算一闪即过,加了之后超慢
在vba中加不加都是一闪即过

TA的精华主题

TA的得分主题

发表于 2012-11-16 13:52 | 显示全部楼层
看来vba的一些用法vs里都得改改了,也许ReDim Preserve 可以用,只是我们不知道正确的方法,呵呵

TA的精华主题

TA的得分主题

发表于 2012-11-16 16:16 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
百度了一下  貌似使用ArrayList可以提高速度。

TA的精华主题

TA的得分主题

发表于 2012-11-16 17:53 | 显示全部楼层
System.Collections.ArrayList类是一个特殊的数组。通过添加和删除元素,就可以动态改变数组的长度,但是速度比一般数组要差些,最好直接定义数组大小,如果无法确定数组大小,定义大一些的数组也比使用ArrayList要快些

TA的精华主题

TA的得分主题

发表于 2012-11-17 13:20 来自手机 | 显示全部楼层
使用范型集合应该会更快把 也可提前定好数组大小 总之怎样.net性能都不是vba能比的

TA的精华主题

TA的得分主题

发表于 2012-11-17 14:14 | 显示全部楼层
本机测试楼主代码运行时间 7.03
使用double类型 7.7

改用固定大小的double数组 0.0038
改用List类型(大小不确定)并使用List.add 方法 0.0040-0.0045

结论...
redim preserve 非常耗时....
List非常好用 耗时多不了多少 但是对于后续的排序 过滤操作非常方便 建议使用^^

6553600 耗时0.36秒
65536000 耗时 3.6秒
严格按照O(n)的时间复杂度 可以看作简化的dictionary方法来用
测试完成后发现List 效率很高啊

测试代码:
  1.         Dim i As Integer
  2.         Dim brr As New List(Of Double)
  3.         Dim timer As New Stopwatch
  4.         timer.Start()
  5.         For i = 0 To 65536000
  6.             'ReDim Preserve brr(i)
  7.             brr.Add(Rnd())
  8.         Next
  9.         timer.Stop()
  10.         MsgBox(timer.Elapsed.TotalSeconds)
复制代码
有兴趣的可以试试
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-9 08:19 , Processed in 0.044256 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表