从Delphi/C++Builder程序员论坛看到的一个测试(0分)

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 版权所有。 未经书面授权,所有页面内容不得以任何介质擅自进行复制或镜像。
 
我也看过这篇文章,但我现在有一个想法,不知道有没有人同意。
那就是在一般并不需要大型运算的场合中,选用什么工具,关键在于程序员对工具的
熟悉程度、习惯以及该工具外部的支持度(包括厂商支持、客户选用、同事使用...)
WINAPI在VB中可以用,delphi中也可以用,你说在哪里运行会快一些呢?大家都知道
建网站用CGI快一些,也安全一些,但ASP简单、方便,建站快,安全性要求不高的站点就可以用,大富翁也是用ASP的。
我两年前也是用VB的,后来因为一个项目转到delphi上,我承认delphi快,但我并不
是因为快才用delphi的,我是因为老板需要、项目需要。但我用了以后就发现delphi
的优点了,结构化、OOP...但我觉得VB的代码编辑器好一些。我现在用惯delphi了,
我希望下一个项目还是用delphi做,当然如果需要用VB的话,我还是会改的。
 
以前看过这片文章.
对目前来说不具普遍性,因为VB5,Delphi3,VC5都不是目前该领域主力工具.
应该是VB6,Delphi4,VC6差不多.
 
这个测试是有问题的。
不足为据。
 
其实代码运行得快慢并不重要,作为程序员最重要的是“思想”。上述测试我认为没
有什么实际意义,难道你能从上述例程运行速度上知道是用vb,vc,c++bulider,delphi
写的吗?要代码运行快那么我们不如用汇编算了。
 
编程序应当是Justdo
it!只有先做起来了和做什么用为主,你建好了
才有功夫去考虑细节,如果是个100元的小程序,你就不必要为这个事烦
恼了,如果是个大项目,反复考察才会得出最好的答案
 
时间太久,强制结束。 wjiachun
 
顶部