3

以下は2つのスニペットです。プログラム間の唯一の違いは、すぐに一方break to returnと他方が異なることに注意してください。returnメソッド内に1つの出口点を設けることは、優れた設計手法であることを理解しています。しかし、ここではデザインについて心配していません。使用料を追加で支払う場合break、どのくらいの追加の計算/メモリ/クロックサイクルを支払いますか?

プログラム1:

public boolean doThis(String[] A){
  boolean indicator = false;
  for(int i=0; i<A.length; i++){
      if(A[i].equals("Taboo"))
        break;
      for(int x=0; x<=i; x++)
          //some work is done here. to make indicator true or false
  }
  return indicator;
}

プログラム2:

public boolean doThis(String[] A){
  boolean indicator = false;
  for(int i=0; i<A.length; i++){
      if(A[i].equals("Taboo"))
        return false;
      for(int x=0; x<=i; x++)
          //some work is done here. to make indicator true or false
  }
  return indicator;
}
4

1 に答える 1

4

コンパイラが優れている場合は、「falseを返す」場合に支払う金額が少し少なくなります。

あなたは「休憩」が高価だと思っているかもしれません。不器用なコンパイラでは、リターンに到達するのは単一のジャンプ命令です。優れたコンパイラーは、ジャンプが不要であることを認識し、コードを拡張してもかまわない場合は、returnステートメントをブレークのポイントまで持ち上げることができます。

「returnfalse」の場合をわずかに安くするのは、「returnインジケーター」が、コンパイラによってほぼ普遍的に使用される呼び出し規約の結果戻りレジスタに結果を配置するために、メモリからのフェッチを必要とする場合があることです。「returnfalse」は、定数をレジスタ(特に、結果を返すレジスタ)にロードします。リテラルはプロセッサがすでにフェッチしている命令ストリームに埋め込まれているため、これは最新のマシンのメモリからのフェッチよりも常に高速です。

洗練されたコンパイラは、すべての変数をレジスタに保持する場合があります。この場合、スマートコンパイラが結果リターンレジスタに「インジケータ」を配置するようにスキームしている可能性があるため、「リターンインジケータ」は実際には高速である可能性があります。値をロードするための作業は必要ありません。文字列の呼び出しを等しくしてコーディングしたプログラムの場合、コンパイラがすべての変数をレジスタに保持しようとするのではないかと思います。平等を求めるために、それらすべてを高額にこぼさなければならないだけです。

この細かい詳細はさておき、これは最適化について心配する必要のある種類のことではありません。

于 2012-05-18T02:04:51.507 に答える