U
urus
Unregistered / Unconfirmed
GUEST, unregistred user!
几种可视化开发工具代码运行速度的比较
邓兴勇
一.引言
众所周知,VB、Delphi、VC++及C++Builder是目前使用较广泛的几种面向对象的可视
化软件开发工具,它们都可在Windows 95和NT环境下开发各种用途的应用软件,如数据
库、多媒体、Internet等软件,且都具有功能强大和使用方便的特点。特别是这些开发工
具都支持ActiveX技术,使得它们现在似乎是无所不能了,这些工具大大地简化了软件开
发人员的工作,因为以前必须写数十条或数百条程序代码的工作,现在只要写几条或加一
个控件即可完成。本文将不去讨论这些开发工具的功能以及它们在使用中的简洁性,仅对
它们的代码运行速度作些初步的比较与分析。
二.代码速度比较分析
本文所选择的进行比较分析的开发工具版本为Visual Basic 5.0、Delphi 3.0、
Visual C++ 5.0及C++ Builder 3.0。分别用这四种软件开发工具编写了一个小程序来测
试它们代码的运行速度,该小程序的测试结果将在本文第四节给出。小程序的界面如图1
所示(这里仅给出用VB5.0编的界面),界面的上部为三幅相同的位图,测试时只显示其
中的一幅,下部为设定循环次数、选择项及信息显示等,底部为开始测试、计时器设置、
保存文件、及退出按钮。测试时,先在设定主循环次数对象中设定好测试的循环次数,按
开始按钮,即开始测试。若计时器设置为“开”,则位图的移动模拟显示在界面上,若计
时器设置为“关”,则界面上没有位图的移动模拟显示,运行测试期间,底部的按钮变灰
并无效,测试结束后,完成的循环次数、测试开始时间及测试运行时间都将显示或更新,
底部的按钮变成有效。
图1.测试软件界面(以VB代码为例)
所进行比较分析的代码内容有:1.模拟一幅位图在界面中移动,即在某一时刻只显
示三幅位图中的一幅,而隐藏其他两幅(只有当测试软件界面中“移动位图Check-Box”
被选中时,这部分代码才执行,只有在计时器处于“开”的状态下,才能看到位图的移
动)。2.打开一个文本文件,从中读取一个字符两次,关闭文件。3.将当前整型的测试
循环次数转化为字符串型,并将字符串型传递给界面上Text控件的Caption属性(这一动
作也只有在计时器处于“开”的状态下才能看到)。4.执行一个从1至40000的循环,在
此循环内执行一次if判别语句、两次I=I+1及I=I-1运算(只有当测试软件界面中“执行次
循环Check-Box”被选中时,这部分代码才执行)。下面以VB的代码为例简单介绍一下测
试部分的代码。
1.移动位图代码如下(在主循环内):
If Check_Move_Set.Value = 1 then
Select Case I
Case 1
Picture1.Visible = True
Picture2.Visible = False
Picture3.Visible = False
I = I + 1
Case 2
Picture1.Visible = False
Picture2.Visible = True
Picture3.Visible = False
I = I + 1
Case 3
Picture1.Visible = False
Picture2.Visible = False
Picture3.Visible = True
I = 1
End Select
End If
这部分代码先判断移动位图的选择项是否被选中,若被选中则显示界面中的三幅位
图之一,并记录接下来的循环要显示的位图号,这样在界面上即产生位图移动的效果。若
计时器的状态为“开”,则可以看到位图移动的效果。在实际测试中,计时器的状态应设
置为“关”,这是因为一则Visual Basic 5.0、Delphi 3.0、Visual C++ 5.0及C++
Builder 3.0计时器的内部运行机制可能不同,二则在界面上显示位图的速度也取决于微
机所配置的显示卡的性能,这都将导致速度测试结果的不正确。另外切不可认为代码中
Picture.Visible = True/False只不过是简单的赋值语句,它的内部运行机制远不止几条
赋值语句。
2.读取文件字符代码如下(在主循环内):
Open "data_VB5.txt" For Input As #1
Input #1, Chr1
Input #1, Chr1
Close #1
这部分代码先打开文本类型的文件“data_vb5.txt”,再从该文件中读取字符两
次,然后关闭文件。
3.类型转换代码如下(在主循环内):
Label_Cur_Num.Caption = Str(II)
这部分代码先将当前测试循环次数整型数转化为字符串型,并将字符串传递给界面
上Label_Cur_Num控件的Caption属性(在计时器处于“开”的状态下,可以看到Caption
属性的变化)。
4.次循环代码如下(在主循环内):
If Check_Min_Set.Value = 1 then
For I1 = 1 To 40000
I_t = I_t + 1
I_t = I_t - 1
If II <= Num_loop then
I_t = I_t + 1
I_t = I_t - 1
End If
Next I1
Num_Do_If = Num_loop * 40002
else
: Num_Do_If = Num_loop * 2
End If
这部分代码先判别执行次循环的选择项是否被选中,若被选中,则执行一遍从1至
40000
的次循环。在这个循环中,执行2次I+1和I-1,执行1次If语句。
三.开发工具编译环境设置
为了使代码运行的速度具有可比性,在设计软件时,把各个开发工具的编译环境都设
置成以速度为基准的优化,并关闭一些可能降低代码运行速度的选择。在VB环境中,项目
属性的编译页的选择如图2所示。
图2.VB的环境设置
在Delphi环境中,项目选择项的编译页的选择如图3所示。
图3.Delphi的环境设置
在VC环境中,项目设置的C/C++选项卡的选择如图4所示。
图4.VC的环境设置
在C++Builder环境中,项目选择项的编译选项卡的选择如图5所示,并在项目选择项
的高级编译选项卡中为CPU选择奔腾指令集。
图5.C++Builder的环境设置
四.测试结果
分别将用Visual Basic 5.0、Delphi 3.0、Visual C++ 5.0及C++ Builder 3.0四种
开发工具编译的软件在不同的微机上运行,并保持微机环境的一致(如退出其他应用软
件,显示器分辨率、颜色设置等),这些微机有:兼容Pentium-100、兼容Cyrix 166、兼
容Pentium MMX-166、兼容AMD K6-266、兼容Pentium II-233、兼容Pentium II-333。测
试时将软件的计时器设置为“关”,主循环次数设置为5000次,测试内容的设置有三种,
1)总体测试,图1界面中的“移动位图”和“执行次循环”选择项都被选中,即本文第二
节介绍的测试代码中四个部分全执行;2)位图移动测试,图1界面中的移动位图被选中,
而“执行次循环”未选中,即第二节介绍的代码中第四部分不执行;3)次循环测试,图1
界面中的“执行次循环”被选中,而“移动位图”未选中,即第二节介绍的代码中第一部
分不执行。
表1至3给出了主循环次数设置为5000时,总体测试、位图移动测试、次循环测试三种
设置状态下,四个测试软件在Pentium-100、Cyrix 6x86、Pentium MMX-166、AMD
K6-266、Pentium II-233、Pentium II-333上运行的一些测试结果,单位为秒。
表1.总体测试结果(单位:秒)
VB5.0
Delphi3.0
VC 5.0
BCB3.0
P 100
398
21.47
60
19.89
Cyrix 166
280
15.33
27
14.50
P MMX-166
263
11.26
17
11.07
K6-266
131
6.92
15
7.91
P II-233
139
6.86
10
8.79
P II-333
99
4.78
10
4.94
表2.位图移动测试结果(单位:秒)
VB5.0
Delphi3.0
VC 5.0
BCB3.0
P 100
30
13.57
55
13.89
Cyrix 166
20
8.63
23
9.22
P MMX-166
14
6.48
14
6.92
K6-266
11
4.72
13
4.89
P II-233
11
4.23
9
4.51
P II-333
8
3.02
9
3.13
表3.次循环测试结果(单位:秒)
VB5.0
Delphi3.0
VC 5.0
BCB3.0
P 100
387
14.77
15
12.96
Cyrix 166
270
11.15
10
10.44
P MMX-166
253
6.48
7
8.51
K6-266
123
4.50
6
5.38
P II-233
130
4.50
5
6.53
P II-333
92
3.19
4
3.29
为了便于分析,将所有的测试结果取倒数,并乘以400,这样所得出的结果与测试运
行时间成反比,与代码的速度成正比。图6至8分别给出了三种测试设置状态的图表形式的
换算后的测试结果。图中纵坐标为换算后的测试结果,其单位为(1/s)。
图6.总体测试结果
图7.位图移动测试结果
图8.次循环测试结果
从上述测试结果来看,VB的速度低于另外三种开发工具,这主要是VB在做次循环
(即执行I+1、I-1代码)时很慢。由表3和图8可以看出,VB这部分代码的运行速度仅为
Delphi的二十至三十分之一,而它移动位图代码的运行速度为Delphi的二至三分之一。从
测试结果中也可以发现,VC的移动位图代码较慢,由表2和图7可看到,它的速度仅为
Delphi和C++Builder的二至三分之一,有时甚至比VB代码还慢,这也许是由于本人没有找
到VC中模拟位图移动最快、最佳的方法。实际上,在本人所编的四个测试软件中,就模拟
位图移动的代码而言,VC的代码的确与VB、Delphi、C++Builder相差较大,后三种开发工
具都是利用Picture.Visible = True/False的机制来实现模拟位图移动的,而VC是利用
ShowWindow(SW_SHOWNORMAL/ W_HIDE)来实现的,这两种方法运行机制可能不一致,在对
VC与VB、Delphi、C++Builder作比较时,最好以表3或图8的结果为依据。
从上述测试结果中不难发现,各种开发工具的代码在不同微机上的运行速度是不一
致的,如C++Builder的代码在K6-266上比在P II-233上快,而VC的代码在K6-266上比在P
II-233上慢。VC的代码在P II-233和P II-333上的“总体测试”和“位图移动测试”结果
竟然是一样的。
总之,通过比较分析测试结果,可以得出如下结论:1)VB的代码运行速度明显低于
另外三种开发工具;2)VC和C++Builder的代码在速度上相差不大,在不同的微机上,它们
的表现不同;3)Delphi代码的速度略高于VC和C++Builder。
五.部分源代码
第二节介绍了VB的测试代码,Delphi和C++Builder的代码与VB的很相似,下面仅给出
从读取开始时间到读取结束时间部分的VC源代码。
m_begin
Timer=CTime::GetCurrentTime();
//读取开始时间
Str_Start_Time=m_begin
Timer.Format("%H:%M:%S");
if (TOF_Timer==0)//若计时器为关,则运行主循环
{
for(II=1;
II<=m_time;
II++, I++)//主循环
{
if (Ccheck_image->GetState( )==1)//1)若移动位图选择为True,移动位图
switch(I)
{
case 1:
m_Static1->ShowWindow(SW_SHOWNORMAL);
m_Static2->ShowWindow(SW_HIDE);
m_Static3->ShowWindow(SW_HIDE);
break;
case 2:
m_Static2->ShowWindow(SW_SHOWNORMAL);
m_Static1->ShowWindow(SW_HIDE);
m_Static3->ShowWindow(SW_HIDE);
break;
case 3:
m_Static3->ShowWindow(SW_SHOWNORMAL);
m_Static1->ShowWindow(SW_HIDE);
m_Static2->ShowWindow(SW_HIDE);
I=0;
break;
}
//结束移动位图
stream = fopen("data_VC5.txt", "r");
//2)打开文件,并读两个字符
chr1=fgetc(stream);
chr1=fgetc(stream);
fclose(stream);
itoa(II, m_timer3_chr, 10);
//3)当前循环次数转为字符串,并赋给Text对象
m_current_times=m_timer3_chr;
if (Ccheck_min->GetState( )==1)
//4)若次循环选择为True,则执行次循环
{
for(int t=0;t<=40000;t++)
{
t=t+1;
//40000次I+1
t=t-1;
//40000次I-1
if (II<=m_time) //40000次If语句
{
t=t+1;
//40000次I+1
t=t-1;
//40000次I-1
}
}
Num_Do_If=m_time*40002;
//Num_Do_If 为If语句执行次数
}
else
Num_Do_If=m_time*2;
}
m_EndTimer=CTime::GetCurrentTime();
//读取结束时间
}
(作者地址:上海工程技术大学 200336 收稿日期:98.09.27)
与电子与电脑杂志社联系 返回pcc主页
Copyright (C) 1999 ZDNet 版权所有。 未经书面授权,所有页面内容不得以任何介质擅自进行复制或镜像。
邓兴勇
一.引言
众所周知,VB、Delphi、VC++及C++Builder是目前使用较广泛的几种面向对象的可视
化软件开发工具,它们都可在Windows 95和NT环境下开发各种用途的应用软件,如数据
库、多媒体、Internet等软件,且都具有功能强大和使用方便的特点。特别是这些开发工
具都支持ActiveX技术,使得它们现在似乎是无所不能了,这些工具大大地简化了软件开
发人员的工作,因为以前必须写数十条或数百条程序代码的工作,现在只要写几条或加一
个控件即可完成。本文将不去讨论这些开发工具的功能以及它们在使用中的简洁性,仅对
它们的代码运行速度作些初步的比较与分析。
二.代码速度比较分析
本文所选择的进行比较分析的开发工具版本为Visual Basic 5.0、Delphi 3.0、
Visual C++ 5.0及C++ Builder 3.0。分别用这四种软件开发工具编写了一个小程序来测
试它们代码的运行速度,该小程序的测试结果将在本文第四节给出。小程序的界面如图1
所示(这里仅给出用VB5.0编的界面),界面的上部为三幅相同的位图,测试时只显示其
中的一幅,下部为设定循环次数、选择项及信息显示等,底部为开始测试、计时器设置、
保存文件、及退出按钮。测试时,先在设定主循环次数对象中设定好测试的循环次数,按
开始按钮,即开始测试。若计时器设置为“开”,则位图的移动模拟显示在界面上,若计
时器设置为“关”,则界面上没有位图的移动模拟显示,运行测试期间,底部的按钮变灰
并无效,测试结束后,完成的循环次数、测试开始时间及测试运行时间都将显示或更新,
底部的按钮变成有效。
图1.测试软件界面(以VB代码为例)
所进行比较分析的代码内容有:1.模拟一幅位图在界面中移动,即在某一时刻只显
示三幅位图中的一幅,而隐藏其他两幅(只有当测试软件界面中“移动位图Check-Box”
被选中时,这部分代码才执行,只有在计时器处于“开”的状态下,才能看到位图的移
动)。2.打开一个文本文件,从中读取一个字符两次,关闭文件。3.将当前整型的测试
循环次数转化为字符串型,并将字符串型传递给界面上Text控件的Caption属性(这一动
作也只有在计时器处于“开”的状态下才能看到)。4.执行一个从1至40000的循环,在
此循环内执行一次if判别语句、两次I=I+1及I=I-1运算(只有当测试软件界面中“执行次
循环Check-Box”被选中时,这部分代码才执行)。下面以VB的代码为例简单介绍一下测
试部分的代码。
1.移动位图代码如下(在主循环内):
If Check_Move_Set.Value = 1 then
Select Case I
Case 1
Picture1.Visible = True
Picture2.Visible = False
Picture3.Visible = False
I = I + 1
Case 2
Picture1.Visible = False
Picture2.Visible = True
Picture3.Visible = False
I = I + 1
Case 3
Picture1.Visible = False
Picture2.Visible = False
Picture3.Visible = True
I = 1
End Select
End If
这部分代码先判断移动位图的选择项是否被选中,若被选中则显示界面中的三幅位
图之一,并记录接下来的循环要显示的位图号,这样在界面上即产生位图移动的效果。若
计时器的状态为“开”,则可以看到位图移动的效果。在实际测试中,计时器的状态应设
置为“关”,这是因为一则Visual Basic 5.0、Delphi 3.0、Visual C++ 5.0及C++
Builder 3.0计时器的内部运行机制可能不同,二则在界面上显示位图的速度也取决于微
机所配置的显示卡的性能,这都将导致速度测试结果的不正确。另外切不可认为代码中
Picture.Visible = True/False只不过是简单的赋值语句,它的内部运行机制远不止几条
赋值语句。
2.读取文件字符代码如下(在主循环内):
Open "data_VB5.txt" For Input As #1
Input #1, Chr1
Input #1, Chr1
Close #1
这部分代码先打开文本类型的文件“data_vb5.txt”,再从该文件中读取字符两
次,然后关闭文件。
3.类型转换代码如下(在主循环内):
Label_Cur_Num.Caption = Str(II)
这部分代码先将当前测试循环次数整型数转化为字符串型,并将字符串传递给界面
上Label_Cur_Num控件的Caption属性(在计时器处于“开”的状态下,可以看到Caption
属性的变化)。
4.次循环代码如下(在主循环内):
If Check_Min_Set.Value = 1 then
For I1 = 1 To 40000
I_t = I_t + 1
I_t = I_t - 1
If II <= Num_loop then
I_t = I_t + 1
I_t = I_t - 1
End If
Next I1
Num_Do_If = Num_loop * 40002
else
: Num_Do_If = Num_loop * 2
End If
这部分代码先判别执行次循环的选择项是否被选中,若被选中,则执行一遍从1至
40000
的次循环。在这个循环中,执行2次I+1和I-1,执行1次If语句。
三.开发工具编译环境设置
为了使代码运行的速度具有可比性,在设计软件时,把各个开发工具的编译环境都设
置成以速度为基准的优化,并关闭一些可能降低代码运行速度的选择。在VB环境中,项目
属性的编译页的选择如图2所示。
图2.VB的环境设置
在Delphi环境中,项目选择项的编译页的选择如图3所示。
图3.Delphi的环境设置
在VC环境中,项目设置的C/C++选项卡的选择如图4所示。
图4.VC的环境设置
在C++Builder环境中,项目选择项的编译选项卡的选择如图5所示,并在项目选择项
的高级编译选项卡中为CPU选择奔腾指令集。
图5.C++Builder的环境设置
四.测试结果
分别将用Visual Basic 5.0、Delphi 3.0、Visual C++ 5.0及C++ Builder 3.0四种
开发工具编译的软件在不同的微机上运行,并保持微机环境的一致(如退出其他应用软
件,显示器分辨率、颜色设置等),这些微机有:兼容Pentium-100、兼容Cyrix 166、兼
容Pentium MMX-166、兼容AMD K6-266、兼容Pentium II-233、兼容Pentium II-333。测
试时将软件的计时器设置为“关”,主循环次数设置为5000次,测试内容的设置有三种,
1)总体测试,图1界面中的“移动位图”和“执行次循环”选择项都被选中,即本文第二
节介绍的测试代码中四个部分全执行;2)位图移动测试,图1界面中的移动位图被选中,
而“执行次循环”未选中,即第二节介绍的代码中第四部分不执行;3)次循环测试,图1
界面中的“执行次循环”被选中,而“移动位图”未选中,即第二节介绍的代码中第一部
分不执行。
表1至3给出了主循环次数设置为5000时,总体测试、位图移动测试、次循环测试三种
设置状态下,四个测试软件在Pentium-100、Cyrix 6x86、Pentium MMX-166、AMD
K6-266、Pentium II-233、Pentium II-333上运行的一些测试结果,单位为秒。
表1.总体测试结果(单位:秒)
VB5.0
Delphi3.0
VC 5.0
BCB3.0
P 100
398
21.47
60
19.89
Cyrix 166
280
15.33
27
14.50
P MMX-166
263
11.26
17
11.07
K6-266
131
6.92
15
7.91
P II-233
139
6.86
10
8.79
P II-333
99
4.78
10
4.94
表2.位图移动测试结果(单位:秒)
VB5.0
Delphi3.0
VC 5.0
BCB3.0
P 100
30
13.57
55
13.89
Cyrix 166
20
8.63
23
9.22
P MMX-166
14
6.48
14
6.92
K6-266
11
4.72
13
4.89
P II-233
11
4.23
9
4.51
P II-333
8
3.02
9
3.13
表3.次循环测试结果(单位:秒)
VB5.0
Delphi3.0
VC 5.0
BCB3.0
P 100
387
14.77
15
12.96
Cyrix 166
270
11.15
10
10.44
P MMX-166
253
6.48
7
8.51
K6-266
123
4.50
6
5.38
P II-233
130
4.50
5
6.53
P II-333
92
3.19
4
3.29
为了便于分析,将所有的测试结果取倒数,并乘以400,这样所得出的结果与测试运
行时间成反比,与代码的速度成正比。图6至8分别给出了三种测试设置状态的图表形式的
换算后的测试结果。图中纵坐标为换算后的测试结果,其单位为(1/s)。
图6.总体测试结果
图7.位图移动测试结果
图8.次循环测试结果
从上述测试结果来看,VB的速度低于另外三种开发工具,这主要是VB在做次循环
(即执行I+1、I-1代码)时很慢。由表3和图8可以看出,VB这部分代码的运行速度仅为
Delphi的二十至三十分之一,而它移动位图代码的运行速度为Delphi的二至三分之一。从
测试结果中也可以发现,VC的移动位图代码较慢,由表2和图7可看到,它的速度仅为
Delphi和C++Builder的二至三分之一,有时甚至比VB代码还慢,这也许是由于本人没有找
到VC中模拟位图移动最快、最佳的方法。实际上,在本人所编的四个测试软件中,就模拟
位图移动的代码而言,VC的代码的确与VB、Delphi、C++Builder相差较大,后三种开发工
具都是利用Picture.Visible = True/False的机制来实现模拟位图移动的,而VC是利用
ShowWindow(SW_SHOWNORMAL/ W_HIDE)来实现的,这两种方法运行机制可能不一致,在对
VC与VB、Delphi、C++Builder作比较时,最好以表3或图8的结果为依据。
从上述测试结果中不难发现,各种开发工具的代码在不同微机上的运行速度是不一
致的,如C++Builder的代码在K6-266上比在P II-233上快,而VC的代码在K6-266上比在P
II-233上慢。VC的代码在P II-233和P II-333上的“总体测试”和“位图移动测试”结果
竟然是一样的。
总之,通过比较分析测试结果,可以得出如下结论:1)VB的代码运行速度明显低于
另外三种开发工具;2)VC和C++Builder的代码在速度上相差不大,在不同的微机上,它们
的表现不同;3)Delphi代码的速度略高于VC和C++Builder。
五.部分源代码
第二节介绍了VB的测试代码,Delphi和C++Builder的代码与VB的很相似,下面仅给出
从读取开始时间到读取结束时间部分的VC源代码。
m_begin
Timer=CTime::GetCurrentTime();
//读取开始时间
Str_Start_Time=m_begin
Timer.Format("%H:%M:%S");
if (TOF_Timer==0)//若计时器为关,则运行主循环
{
for(II=1;
II<=m_time;
II++, I++)//主循环
{
if (Ccheck_image->GetState( )==1)//1)若移动位图选择为True,移动位图
switch(I)
{
case 1:
m_Static1->ShowWindow(SW_SHOWNORMAL);
m_Static2->ShowWindow(SW_HIDE);
m_Static3->ShowWindow(SW_HIDE);
break;
case 2:
m_Static2->ShowWindow(SW_SHOWNORMAL);
m_Static1->ShowWindow(SW_HIDE);
m_Static3->ShowWindow(SW_HIDE);
break;
case 3:
m_Static3->ShowWindow(SW_SHOWNORMAL);
m_Static1->ShowWindow(SW_HIDE);
m_Static2->ShowWindow(SW_HIDE);
I=0;
break;
}
//结束移动位图
stream = fopen("data_VC5.txt", "r");
//2)打开文件,并读两个字符
chr1=fgetc(stream);
chr1=fgetc(stream);
fclose(stream);
itoa(II, m_timer3_chr, 10);
//3)当前循环次数转为字符串,并赋给Text对象
m_current_times=m_timer3_chr;
if (Ccheck_min->GetState( )==1)
//4)若次循环选择为True,则执行次循环
{
for(int t=0;t<=40000;t++)
{
t=t+1;
//40000次I+1
t=t-1;
//40000次I-1
if (II<=m_time) //40000次If语句
{
t=t+1;
//40000次I+1
t=t-1;
//40000次I-1
}
}
Num_Do_If=m_time*40002;
//Num_Do_If 为If语句执行次数
}
else
Num_Do_If=m_time*2;
}
m_EndTimer=CTime::GetCurrentTime();
//读取结束时间
}
(作者地址:上海工程技术大学 200336 收稿日期:98.09.27)
与电子与电脑杂志社联系 返回pcc主页
Copyright (C) 1999 ZDNet 版权所有。 未经书面授权,所有页面内容不得以任何介质擅自进行复制或镜像。