先看两段 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