技术: 取舍 try finally

翟二喜

先看两段 Delphi 程序

aStringList1 := TStringList.Create;
try
bStringList2 := TStringList.Create;
try
// ...
finally
aStringList2.Free;
end;
finally
aStringList1.Free;
end;

aStringList1 := TStringList.Create;
aStringList2 := TStringList.Create;
try
//
...
finally
aStringList2.Free;
aStringList1.Free;
end;

是追求完美,还是追求效率?(再或者是追求省事?)

借用 delphibbs 一个贴子中的测试:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=712578

procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
tick: Cardinal;
begin
tick := GetTickCount;
for i := 0 to 99999999 do
try
if 'asdfkl;jaskl;dfjaskl;dfjl;' = 'asdfklasjfsh' then
ShowMessage('adf');
finally
end;
Label1.Caption := IntToStr(GetTickCount - Tick);
end;

try finally 耗时 1900 毫秒
try except  耗时 570  毫秒
没有 try 耗时 130  毫秒

try finally 的时间是程序中的字符串判断的时间的大约 (1900-130) / 130 = 13.6 倍(我认为并不是太慢的数字)

内存耗费情况没有计算,有时间再试试 .NET C#中的 try finally 的时间耗费情况,还要再仔细看看他们的汇编代码。

到底有没有必要宁可降低程序可信度而提高运行效率呢?或者说,在二选一的可能下如何取舍呢。

1月31日 3:54
在 .NET 2.0 上做了一测试:

private void button1_Click(object sender, EventArgs e)
{
DateTime timeStart = DateTime.Now;
for (int i=0; i<99999999; i++)
{
try
{
if ("abc"=="cba")
{
MessageBox.Show("test");
}
}
finally // catch
{
}
}
DateTime timeEnd = DateTime.Now;
MessageBox.Show((timeEnd.Ticks - timeStart.Ticks).ToString());
}

在一台P4m1.6G笔记本的WinXP下跑,大概结果是:
try finally:1950xxxx Ticks
try except:1261xxxx Ticks
没有try:1080xxxx Ticks

try finally 的用时近似于一个字符串判断的时间;
try except 的用时大概是一个字符串判断的1/4

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: