0

誰かがこれについて私に尋ねました.いくつかの大きなOのものを読んだ後でも、2つのデザインのどちらが速いかわかりません.

1 つのメソッドにこの種のネストされたループがある場合

public void someMethod(){
    for (a=0;a<10;a++){
     for (b=0;b<10;b++){
      for (c=0;c<10;c++){
       for (d=0;d<10;d++){
       }
      }
     }
    }
}

メソッドを再設計し、2 つの内側の for ループを別のメソッドに配置することにしました。

public void someMethod(){
     for (a=0;a<10;a++){
         for (b=0;b<10;b++){
          2loopsMethod();
         }
        }
    }

public void 2loopsMethod(){
for (c=0;c<10;c++){
 for (d=0;d<10;d++){
 }
}

}

私の質問は、再設計されたメソッドは、別のメソッドに配置したため、元のコードよりもはるかに高速になりますか、それとも違いはありませんか?

4

4 に答える 4

8

違いはありません。まだ 4 レベルのネストされたループがあるため、作業の一部をメソッド呼び出しに委譲しても高速にはなりません。

(技術的には、メソッド呼び出しのオーバーヘッドが追加されるため、2 番目の例は少し遅くなりますが、コードが何か重要なことを行っている場合は、違いを測定することさえできれば驚くでしょう。)

于 2012-07-08T15:57:45.860 に答える
1

Big O の複雑さは同じです。a*b メソッド呼び出しがないため、最初のバージョンの方が高速だと思います。理論的には、メソッド呼び出しには余分な時間がかかります。

于 2012-07-08T15:58:00.910 に答える
1

メソッドの呼び出しには追加の時間がかかるため、再設計されたメソッドは少しだけ遅くなります (たとえば、C++ インライン関数とは異なります)。ループの反復回数を増やすと、間違いなく違いがわかります。

于 2012-07-08T16:02:14.007 に答える
0

メソッドに対するコンパイラの最適化により、2 番目の例が優先されます。

public class Try1 {

	static int sum;
	public static void main(String[] args) {

		long startTime, endTime;

		while(true)
		{
			sum = 0;
			startTime = System.nanoTime();
			for (int i = 0; i < 2000; i++) {	
				for (int j = 0; j < 1000; j++) {
					sum = sum + i;
				}
			}
			
			endTime = System.nanoTime();
			System.out.println("no method took:" + (endTime -startTime) );

			sum = 0;
			startTime = System.nanoTime();
			for (int i = 0; i < 2000; i++) {	
				func(i);
			}
			endTime = System.nanoTime();
			System.out.println("with method took:" + (endTime -startTime) );
			
		}

	}

	private static final void func(int i) {
		for (int j = 0; j < 1000; j++) {
			sum = sum + i;
		}
	}

}

結果を終了します。

メソッドを使用しなかった:3077459 メソッドを使用した:2418027 メソッドを使用しなかった:5535578 メソッドを使用した:76014 メソッドを使用しなかった:3857167 メソッドを使用した:88844 メソッドを使用しなかった:3758701 メソッドを使用した:89165 メソッドを使用しなかった:3761588 メソッドを使用した:88844

于 2014-11-14T12:46:43.467 に答える