10

私は 2 番目のtry-exceptバリアントを使用するように勧められましたが、他の人の意見も知りたいです: 以下の 2 つの手順のうち、どちらの手順がより時間効率がよいでしょうか?

procedure LoadImage(img: TImage; filename: string);
begin
  if fileexists(filename) then
    img.Picture.Loadfromfile(filename)
  else
    img.Picture.Loadfromfile('default.jpg')
end;

また

procedure LoadImage(img: TImage; filename: string);
begin
  try
    img.Picture.Loadfromfile(filename)
  except
    img.Picture.Loadfromfile('default.jpg')
  end
end;
4

3 に答える 3

8

効率を忘れてください。コードの可読性は、はるかに重要です。時期尚早の最適化はあらゆる悪の根源です。

最初のものは、その意図が明確です。誰でも簡単に何が起きているかを把握できます。

2 つ目は、「なにこれ....?」と立ち止まってしまいます。

コードが 2 番目の反応を引き起こすことは決してありません。

于 2012-08-10T13:17:05.577 に答える
4

時間効率が唯一の基準である場合は、例外処理が CPU を消費するため、最初のものが高速になります。

FileExists() は 1 つの WinApi 呼び出しを使用するため高速ですが、ファイルが存在するかどうかのみをチェックします。ファイルは存在するが、その形式が間違っているか、他のスレッドによってブロックされている場合、未処理の例外が発生します。

于 2012-08-10T13:07:10.637 に答える
0

あなたの質問の問題の 1 つは、目的のセマンティクスを指定していないことです。考えられる解釈は 2 つあります。どちらのソリューションが優れているかは、その選択によって異なります。フォールバックを読み込めないのは致命的なエラーだと思います。

  1. 最初のファイルが存在する場合はそれをロードし、存在しない場合は 2 番目のファイルをロードします。最初のファイルが存在するがロードできなかった場合は、エラーを表示します。
  2. 最初のファイルを読み込めない場合は、2 番目のファイルにフォールバックします。

1) のセマンティクスが必要な場合は、最初のコードで問題ありません。

2) のセマンティクスが必要な場合は、どちらも適切ではありません。次の理由により、最初のコードにはこれらのセマンティクスがありません。

  1. 競合状態があります。ファイルの存在を確認してからロードするまでの間にイメージが削除されると、失敗します。
  2. ファイルが存在するがロードできない場合は、例外がスローされます。これは、ファイルが有効な画像ではないか、開くことができない場合に発生する可能性があります。

2 番目のものは、よくあるケースの例外を使用していますが、これは悪いことです。

したがって、私が使用する 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;

開く前に存在をチェックすると、エラーの場合は速くなりますが、成功の場合は遅くなります。したがって、どちらが速いかは、使用状況によって異なります。

個人的には、正常に動作しているアプリケーションが例外をスローするべきではないと考えているため、画像がたまにしか見つからない場合でも、2 番目のバリアントよりも 3 番目のバリアントを使用します。ベンチマークでパフォーマンスの問題が顕著であることが判明した場合にのみ、パフォーマンスの問題を気にします。

より対象を絞った例外句も検討する必要があります。すべての例外をキャッチするブランケットはスタイルが悪いです。残念ながら、どの例外が によってスローされるかについて明確な仕様を見つけることができなかったTPicture.LoadFromFileので、ここではブランケット節にとどめておきます。

于 2012-08-10T12:34:04.940 に答える