Bog*_*BBA 10 delphi performance if-statement try-except
我被推荐使用第二个,try-except变体,但我也想知道其他人的想法:下面两个(如果有的话)哪个程序更节省时间?
procedure LoadImage(img: TImage; filename: string);
begin
if fileexists(filename) then
img.Picture.Loadfromfile(filename)
else
img.Picture.Loadfromfile('default.jpg')
end;
Run Code Online (Sandbox Code Playgroud)
要么
procedure LoadImage(img: TImage; filename: string);
begin
try
img.Picture.Loadfromfile(filename)
except
img.Picture.Loadfromfile('default.jpg')
end
end;
Run Code Online (Sandbox Code Playgroud)
忘记效率.代码可读性方式更重要.过早优化是各种邪恶的根源.
第一个是明确的意图.每个人都可以轻松搞清楚到底是什么.
第二个让我停下来走"什么......?"
你永远不希望你的代码引起第二反应.
您的问题的一个问题是您没有指定所需的语义。有两种可能的解释,哪种解决方案更好取决于该选择。我认为无法加载后备是一个致命错误。
如果您想要 1) 的语义,您的第一个代码就可以了。
如果您想要 2) 的语义,则两者都不好。第一个代码没有这些语义,因为:
第二种使用常见情况的异常,这是很糟糕的。
因此,为了实现第二个语义,我将使用:
procedure LoadImage(img: TImage; filename: string);
var success:boolean;
begin
success := false;
if FileExists(filename)
then try
img.Picture.LoadFromFile(filename);
success := true;
except
end
if not success
then img.Picture.LoadFromFile('default.jpg');
end;
Run Code Online (Sandbox Code Playgroud)
在打开之前检查是否存在会使错误情况更快,但成功情况会更慢。所以哪一个更快取决于你的使用情况。
就我个人而言,我会使用第三个变体而不是第二个变体,即使图像只是偶尔丢失,因为我相信正常运行的应用程序不应该抛出异常。如果基准测试显示性能问题很明显,我只会关心性能问题。
您还应该考虑更有针对性的例外条款。笼统地捕捉所有异常是不好的风格。不幸的是,我找不到明确的规范来抛出哪些异常TPicture.LoadFromFile,所以我现在将保留在毯子条款中。