beta 的第三篇心得:深入研究 case 语句 (50分)

  • 主题发起人 主题发起人 beta
  • 开始时间 开始时间
我觉得大家好像有点偏题了,本贴 讨论 case 与 if then
else
if 之间的执行效率
并且也仅仅是研究效率,并弄明白 case 究竟是怎么工作的。完全没有鼓吹大家都来用
case。自己用什么顺手,就用什么,没有必要制定什么标准,也不能制定。但是我听你
们的口气好像我拿刀逼着你们非要用 case 不可[:D]
小雨哥:你原来的代码只是有点误差,这样改了过后反而是有问题了(具体我前面已经
说过了)
DoubleWood:的确,if then
else
if 把大部分的时间用在了比较字符串上,这也有失
公平,不过要是改成公平的,也一样体现出差异:)
 
个人觉得case对于整个程序的流畅,整体的思路帮助很大,过多的if then
else
或者多个
if then
else
嵌套,使程序杂乱无章,可读性差,对于将来的维护造成不便
 
把程序改成下面这个样子,公平了吧[:)]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, TypInfo;
type
TMyStrSel = (Beijing, Tianjing, Shanghai, Chongqing);
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
ComboBox1: TComboBox;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
t1, t2: Cardinal;
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Text := '1';
with ComboBox1.Itemsdo
begin
Add('1');
Add('2');
Add('3');
Add('4');
Add('5');
Add('6');
Add('7');
Add('8');
Add('9');
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
strSel: Integer;
i: Cardinal;
begin
strSel := StrToInt(ComboBox1.Text);
i := 4294967;
// 多转几次:)
t2 := 0;
t1 := GetTickCount;
while i > 0do
begin
case strSel of
0: t2 := GetTickCount;
1: t2 := GetTickCount;
2: t2 := GetTickCount;
3: t2 := GetTickCount;
4: t2 := GetTickCount;
5: t2 := GetTickCount;
6: t2 := GetTickCount;
7: t2 := GetTickCount;
8: t2 := GetTickCount;
else
t2 := GetTickCount;
end;
dec(i);
end;
Caption := Format('case 方法, 计算时间 %u ms', [t2 - t1]);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
strSel: Integer;
i: Cardinal;
begin
strSel := StrToInt(ComboBox1.Text);
i := 4294967;
// 多转几次:)
t2 := 0;
t1 := GetTickCount;
while i > 0do
begin
if strSel = 1 then
t2 := GetTickCount
else
if strSel = 2 then
t2 := GetTickCount
else
if strSel = 3 then
t2 := GetTickCount
else
if strSel = 4 then
t2 := GetTickCount
else
if strSel = 5 then
t2 := GetTickCount
else
if strSel = 6 then
t2 := GetTickCount
else
if strSel = 7 then
t2 := GetTickCount
else
if strSel = 8 then
t2 := GetTickCount
else
t2 := GetTickCount;
Dec(i);
end;
Caption := Format('if 方法, 计算时间 %u ms', [t2 - t1]);
end;

end.

测试结果如下:(以下时间取 10 次的平均值,单位毫秒)
选择 case 方法 if 方法
1 92 72
2 94 81
3 95 100
4 89 112
5 120 120
6 91 128
7 95 147
8 92 158
9 74 158
我不加评论了:)
 
有必要研究这样的问题吗?交给那些搞导弹发射的专家们去想吧。
 
beta你的方法是公平,但是和你的题目不符,
你好像在讨论字符串用在case里,我其实没有别的意思,
一般的,如果分支在几个(几个?谁知道?)case比if else
效率高,
但是,我只是看到你们竟然要用字符串再case中的应用来比较效率时,
我觉得,效率?

你的方法在case以前,已经做了字符串比较了
但是如果说可读性,或者说易维护性,如果需要比较的情况不太多,
case 当然由于if else

我也知道你发表这一系列贴子的意思,我们都希望你又更多的帖子出来,我也佩服你,
但是你一定要说你的case 字符串 of比if else
的效率高,我觉得值得商榷,就只这一点
请你务必不要误会我的意思
 
呵呵呵呵。
我的感想?
不可说,不可说。
 
to Another_eYes:
论坛已经很难得见到这样讨论问题的气氛了,一定要说,不可不说[:D]
 
既然.....那么.....
总之我后悔呀。 早知道这都能作为心得发表....
 
Another_eYes,后悔什么,你再来一篇不就得了
等会儿我也来一篇,关于
以下代码哪个函数效率高?
type intarray = array of integer;
funtion f(a: intarray): integer;
funtion f(const a: intarray): integer;
funtion f(var a: intarray): integer;
 
应该是funtion f(var a: intarray): integer;
这个效率最高,它只不过传了一个指针而已
 
zjfeng,你的答案不对,呵呵
 
chillkwanjane:
// case 字符串 of比if else
的效率高
你这个应该到我的第二篇里面去发吧。
Another_eYes:
没有谁说非要高深的才可以作为心得嘛,要知道最近新手很多:)
看来我有必要再次重申一遍,大家看看我这篇帖子的题目先。
写本文的最大目的是搞清楚 case 的实现,效率问题只是一个“副产品”而已。
虽然说这的确是受了第二篇的影响才导致我去思考的,但是写本文并不是为了作为
第二篇的理论依据。请大家不要混为一谈。
 
哎呀,beta.
真不好意思,我把你下一篇想写的已经不小心写出来了。
看看这: http://www.delphibbs.com/delphibbs/dispq.asp?lid=1411217
呵呵呵呵
 
SS2000,怎么才是正确答案呢,是不是这也得视情况而定?
 
Another_eYes:别客气,让你写篇心得出来,我也是功劳一件啊:)
何况我并不准备下次写那个[:D]
 
就喜欢大富翁的这种讨论气氛!
 
[:)]
听课、学习、收藏!
 
这样讨论是有意思,可以学到很多东西。
不过我觉得,这个问题好象BOLAND就应该做到,DELPHI都升级到7.0了,还不支持字符串。
是不是有点美中不足啊?
而且DELPHI美中不足的好象不止这一点啊,好多呢。
当然,这并不影响我对DELPHI与BOLAND的敬爱。
 
后退
顶部