| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 995 人关注过本帖
标题:变量类型对运算速度的影响
只看楼主 加入收藏
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4941
专家分:30047
注 册:2008-10-15
结帖率:100%
收藏
 问题点数:0 回复次数:7 
变量类型对运算速度的影响
我还是认为开新贴大家看的好一点。

Dim dis1, dis2, temp, clm As Integer

这里面,定义的 dis1 的类型是什么??
Integer ??

错,是 Variant  类型。具体类型根据运算过程中的数据再决定它的子类型。

所以不能学C里的写法 int dis1,dis2;
C里前面是类型定义符,后面是变量。
VB里,每个变量必须指定类型,如果没有指定类型的,就全是 Variant

最后,现在的 OS 都是 32位的。integer 是16位的,Long 是32位。
这二种数据类型中,自然是与 OS 字长相同的类型 long 运行速度更快。你们可以去测试。
所以,如果不是内存特别紧张的系统上,个人不推荐使用 integer 变量作为普通变量的类型来使用。
这个,可以测试:
新建一个工程,在窗体拉一个 Command1 ,位置不要顶格。
程序原理,就是执行500*60000 的循环,循环里做一个 加法。计算时间。直接显示在窗体上。integer 的那个怎么都要大一些,虽然这个数据很小,但对于如果是操作密集型的运算来说,这个就有点可观了。

Private Sub Command1_Click()
Dim i1 As Single, i2 As Single        '计时变量
Dim b1 As Integer, b2 As Long         '供对比测试用的二个变量
Dim k As Long                         '循环里的垃圾变量
Dim m As Long                         '增加循环次数的变量

Me.Cls
    i1 = Timer
For m = 1 To 500
    For b1 = -30000 To 30000
        k = b1 + 1
    Next b1
Next m
    i1 = Timer - i1
   
    i2 = Timer
For m = 1 To 500
    For b2 = -30000 To 30000
        k = b2 + 1
    Next b2
Next m
    i2 = Timer - i2
   
    Me.Print TypeName(b1); "类型用时:"; i1, TypeName(b2); "类型用时:"; i2, "差:"; i1 - i2
   
End Sub

测试时,可以把 b1的定义的类型去掉,然后测试看看时间差和B1的实际类型,
搜索更多相关主题的帖子: 变量 运算速度 类型 
2008-10-16 21:23
multiple1902
Rank: 8Rank: 8
等 级:贵宾
威 望:42
帖 子:4881
专家分:671
注 册:2007-2-9
收藏
得分:0 
业界公认的是长度等于计算机字长时速度最快,这就是为什么FP里的Integer范围相当于TP里的Longint……
2008-10-16 21:27
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4941
专家分:30047
注 册:2008-10-15
收藏
得分:0 
看到大多数人发的代码里,还是 integer ,就觉有有这么必要发个一贴 出来,
大家也可以手动自己测试一下,看看差多少。
目前测试到 Variant 类型是最慢的。我这里差1秒多。

授人于鱼,不如授人于渔
早已停用QQ了
2008-10-16 21:30
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4941
专家分:30047
注 册:2008-10-15
收藏
得分:0 
微软的内置控件里,很多属性的取值也是 integer ,烦。
一个滚动条,我需要他滚动到 37000 的位置去。
设置 max = 37000
好啦,不工作。靠。

授人于鱼,不如授人于渔
早已停用QQ了
2008-10-16 21:31
multiple1902
Rank: 8Rank: 8
等 级:贵宾
威 望:42
帖 子:4881
专家分:671
注 册:2007-2-9
收藏
得分:0 
[bo][un]风吹过b[/un] 在 2008-10-16 21:31 的发言:[/bo]

微软的内置控件里,很多属性的取值也是 integer ,烦。
一个滚动条,我需要他滚动到 37000 的位置去。
设置 max = 37000
好啦,不工作。靠。

需要你自己把滚动条的范围离散化一下啦。
你明明知道正常人用不到上万的分辨率的……
2008-10-16 21:32
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4941
专家分:30047
注 册:2008-10-15
收藏
得分:0 
自己作滚动条了。
不过,最后放弃使用滚动条,而以把鼠标滚轮支持放进去了,等会放出完整源码。
包含那个OLE拖放打开文件功能在内。

一个滚动条,增加了程序体积是 16K 。也有点不稳定。不稳定时,表现在拖动滑块时,定位不准确,因为决定不使用滚条,所以就没再去修改。
滚动条的代码在这:
存在的控件,3个按钮,名字分别为:UP , DOWN ,HK
还有一个 Shape,名字就叫 Shape1 ,美观用的

Option Explicit

Const 高度 = 255
'缺省属性值:
Const m_def_Enabled = 1
Const m_def_LargeChange = 1
Const m_def_SmallChange = 1
Const m_def_Value = 0
Const m_def_Min = 0
Const m_def_Max = 0
'属性变量:
Dim m_Enabled As Boolean
Dim m_LargeChange As Long
Dim m_SmallChange As Long
Dim m_Value As Long
Dim m_Min As Long
Dim m_Max As Long
'事件声明:
Event Change()

'拖动用的
Dim Y2 As Long
Dim tdyn As Boolean


Private Sub Down_Click()
Dim i As Long
i = m_Value + m_SmallChange
Call 改变值(i)
End Sub

Private Sub Up_Click()
'
Dim i As Long
i = m_Value - m_SmallChange
Call 改变值(i)
End Sub

Private Sub 改变值(cs As Long, Optional 是否事件 As Boolean = True)

'If cs < m_Min Then
'    cs = m_Min
'End If
'
'If cs > m_Max Then
'    cs = m_Max
'End If
'
    m_Value = cs
   
Call 重绘滑块位置(是否事件)
HK.SetFocus

End Sub

Private Sub UserControl_Initialize()

HK.Top = 高度 + 32
'HK.Height = 高度
HK.Left = 0



End Sub

Private Sub HK_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
'
If Button And 1 = 1 Then
    tdyn = True
    Y2 = Y
End If

End Sub

Private Sub HK_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

Dim i As Long

If Button And 1 = 1 Then
    If tdyn Then
        i = Y - Y2 + HK.Top
        If i > 高度 + 32 And i < UserControl.ScaleHeight - 高度 - 32 - HK.Height Then
            HK.Top = i
        End If
    End If
End If

End Sub

Private Sub HK_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

Dim i As Long
Dim j As Long
Dim o As Double
Dim m As Long

If Button And 1 = 1 Then
    tdyn = False
    i = UserControl.ScaleHeight - 高度 - 高度 - 64 - HK.Height          '去掉所有的未使用的区域
    j = m_Max - m_Min           '计算对应多少格
    If j = 0 Then Exit Sub
    o = i / j                  '每格对应多少坐标
    m = (HK.Top - 高度) / o - 1        '折算出对应的值   
    Call 改变值(m)
End If

End Sub

Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim i As Long
If Not m_Enabled Then Exit Sub

If Y < HK.Top Then
    i = m_Value - m_LargeChange
    If i < m_Min Then
        i = m_Min
    End If
        m_Value = i
        
    Call 重绘滑块位置
ElseIf Y > HK.Top Then
    i = m_Value + m_LargeChange
    If i > m_Max Then
        i = m_Max
    End If
        m_Value = i
    Call 重绘滑块位置
End If

End Sub

Private Sub UserControl_Resize()
Up.Height = 高度
Down.Height = 高度
Up.Move 0, 0, UserControl.ScaleWidth, 高度
Down.Move 0, UserControl.ScaleHeight - 高度 - 32, UserControl.ScaleWidth, 高度

HK.Width = UserControl.ScaleWidth - 0

Shape1.Move 0, 0, UserControl.ScaleWidth, UserControl.ScaleHeight

End Sub
'注意!不要删除或修改下列被注释的行!
'MemberInfo=8,0,0,0
Public Property Get Min() As Long
    Min = m_Min
End Property

Public Property Let Min(ByVal New_Min As Long)
    m_Min = New_Min
    PropertyChanged "Min"
    Call 重绘滑块大小
    Call 重绘滑块位置(False)
End Property

'注意!不要删除或修改下列被注释的行!
'MemberInfo=8,0,0,0
Public Property Get Max() As Long
    Max = m_Max
End Property

Public Property Let Max(ByVal New_Max As Long)
    m_Max = New_Max
    PropertyChanged "Max"
    Call 重绘滑块大小
    Call 重绘滑块位置(False)
End Property

'为用户控件初始化属性
Private Sub UserControl_InitProperties()
    m_Min = m_def_Min
    m_Max = m_def_Max
    m_Value = m_def_Value
    m_LargeChange = m_def_LargeChange
    m_SmallChange = m_def_SmallChange
    m_Enabled = m_def_Enabled
End Sub

'从存贮器中加载属性值
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)

    m_Min = PropBag.ReadProperty("Min", m_def_Min)
    m_Max = PropBag.ReadProperty("Max", m_def_Max)
    m_Value = PropBag.ReadProperty("Value", m_def_Value)
    m_LargeChange = PropBag.ReadProperty("LargeChange", m_def_LargeChange)
    m_SmallChange = PropBag.ReadProperty("SmallChange", m_def_SmallChange)
    m_Enabled = PropBag.ReadProperty("Enabled", m_def_Enabled)
   
    Call 重绘滑块大小
    Up.Enabled = m_Enabled
    Down.Enabled = m_Enabled
    HK.Enabled = m_Enabled

End Sub

'将属性值写到存储器
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)

    Call PropBag.WriteProperty("Min", m_Min, m_def_Min)
    Call PropBag.WriteProperty("Max", m_Max, m_def_Max)
    Call PropBag.WriteProperty("Value", m_Value, m_def_Value)
    Call PropBag.WriteProperty("LargeChange", m_LargeChange, m_def_LargeChange)
    Call PropBag.WriteProperty("SmallChange", m_SmallChange, m_def_SmallChange)
    Call PropBag.WriteProperty("Enabled", m_Enabled, m_def_Enabled)
End Sub

Private Sub 重绘滑块大小()
        
    Dim i As Long
    Dim j As Long
    Dim m As Long
   
    i = UserControl.ScaleHeight - 高度 - 高度 - 64           '去掉所有的未使用的区域
    j = m_Max - m_Min + 1         '计算对应多少格
    If j = 0 Then
        HK.Height = i
        HK.Top = 高度 + 32
    Else
        m = i / j
        If m < 高度 Then
            m = 高度
        End If
        HK.Height = m
    End If
End Sub

'注意!不要删除或修改下列被注释的行!
'MemberInfo=8,0,0,0
Public Property Get Value() As Long
    Value = m_Value
End Property

Public Property Let Value(ByVal New_Value As Long)
    m_Value = New_Value
    PropertyChanged "Value"
    Call 重绘滑块位置
End Property

'注意!不要删除或修改下列被注释的行!
'MemberInfo=8,0,0,1
Public Property Get LargeChange() As Long
    LargeChange = m_LargeChange
End Property

Public Property Let LargeChange(ByVal New_LargeChange As Long)
    m_LargeChange = New_LargeChange
    PropertyChanged "LargeChange"
End Property

'注意!不要删除或修改下列被注释的行!
'MemberInfo=8,0,0,1
Public Property Get SmallChange() As Long
    SmallChange = m_SmallChange
End Property

Public Property Let SmallChange(ByVal New_SmallChange As Long)
    m_SmallChange = New_SmallChange
    PropertyChanged "SmallChange"
End Property


Private Sub 重绘滑块位置(Optional 是否事件 As Boolean = True)
'
Dim i As Long
Dim j As Long
Dim o As Single
Dim m As Long
   
    If m_Value < m_Min Then m_Value = m_Min
    If m_Value > m_Max Then m_Value = m_Max

    i = UserControl.ScaleHeight - 高度 - 高度 - 64 - HK.Height          '去掉所有的未使用的区域
    j = m_Max - m_Min           '计算对应多少格
    If j = 0 Then Exit Sub
    o = i / j                  '每格对应多少坐标
    HK.Top = o * m_Value + 高度 + 32
If 是否事件 Then
    HK.SetFocus
    RaiseEvent Change
End If
End Sub
'注意!不要删除或修改下列被注释的行!
'MemberInfo=0,0,0,0
Public Property Get Enabled() As Boolean
    Enabled = m_Enabled
End Property

Public Property Let Enabled(ByVal New_Enabled As Boolean)
    m_Enabled = New_Enabled
    PropertyChanged "Enabled"
   
    Up.Enabled = m_Enabled
    Down.Enabled = m_Enabled
    HK.Enabled = m_Enabled
End Property

找到错误的地方了,重新修正了代码。
竖滚动条。范围是 long

[[it] 本帖最后由 风吹过b 于 2008-10-16 21:51 编辑 [/it]]

授人于鱼,不如授人于渔
早已停用QQ了
2008-10-16 21:41
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
我还是喜欢用Integer~~~~反正也慢不了多少

从BFS(Breadth First Study)到DFS(Depth First Study)
2008-10-16 21:42
Joforn
Rank: 6Rank: 6
等 级:贵宾
威 望:23
帖 子:1242
专家分:122
注 册:2007-1-2
收藏
得分:0 
我一般用Long,不是为了速度,而是为了更不容易溢出,反正和Integer比起来也只多两个字节。

VB QQ群:47715789
2008-10-16 22:49
快速回复:变量类型对运算速度的影响
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017063 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved